2009-12-02 17 views
6

¿Es posible concatenar nombres de variables en C? En concreto, tengo un struct que contiene 6 variables similares, que se llama class1, class2, class3, etc.Concatenar nombres de variables en C?

Quiero correr a través de un bucle para asignar a cada variable de un valor, pero no puedo ver cómo se hace sin concatenar de algún modo el nombre de la variable con el valor del contador de bucle for.

¿De qué otra manera podría hacer esto?

Respuesta

43

Cuando usted se encuentra la adición de un sufijo entero a los nombres de variables, piensan que debería haber utilizado una serie.

struct mystruct { 
    int class[6]; 
}; 

int main(void) { 
    struct mystruct s; 
    int i; 
    for (i = 0; i < 6; ++i) { 
     s.class[i] = 1000 + i; 
    } 

    return 0; 
} 

Nota: Un compilador de C++ será vomitar en esta causa de class. Tendrá que encontrar un nombre diferente para ese campo si planea compilar este código como C++.

5

Hay idiomas dinámicos en los que puede hacer este tipo de cosas: C no es uno de estos idiomas. Estoy de acuerdo con Sinan: las matrices o los vectores STL son el camino a seguir.

Como un experimento de pensamiento: ¿qué pasaría si tiene 100,000 de estas variables? ¿Tendría 100,000 líneas de código para inicializarlas?

+2

1 Perl, por ejemplo, permite el uso de este tipo de referencias simbólicas, pero su uso es ** ** fuertemente desaconsejado. http://perl.plover.com/varvarname.html –

1

El preprocesador C puede concatenate símbolos, pero ¿ha considerado utilizar una matriz?

+2

La concatenación de preprocesador no funcionará, porque si concatena 'clase' con la variable de bucle' i', producirá 'classi' y el compilador se quejará de que no existe tal el símbolo existe – benzado

0

Lo que también podría hacer es escribir una implementación de un mapa hash. Dado que el conjunto de claves (que serían como nombres de variables) del mapa hash no cambia con el tiempo, para cada mapa hash puede mantener una matriz de sus claves para iterar de manera eficiente. Pero eso sería un total (loco) exageración, sobre todo en C;)

Casi cualquier cosa es posible en C, que es un gran lenguaje para aprender :)

0

quizás el CERT-c Fije la codificación PRE05 regla -C 'Comprenda el reemplazo macro cuando concatena tokens o realiza stringification' podría ayudarlo. Para más detalles, consulte este enlace: https://www.securecoding.cert.org/confluence/display/seccode/PRE05-C.+Understand+macro+replacement+when+concatenating+tokens+or+performing+stringification.

para abreviar, defina primero una JOIN_AGAIN macro (x, y) (x ## y) y luego unirse a (x, y) JOIN_AGAIN (x, y) La macro JOIN_AGAIN permite expandir el valor de la couner bucle que se concatenará con el nombre var.

Saludos Pierre Bui

+0

incorrecto Simplemente producirás 'classi'; el preprocesador simplemente produce más caracteres y no tiene nada que ver con los valores de tiempo de ejecución. – GManNickG

+0

tienes razón GMAN, gracias por este comentario. oups, no bien despierto el domingo por la mañana. siento publicar una respuesta incorrecta. Pierre Bui –

Cuestiones relacionadas