Concatenando nomes de variables ​​em C?

É possível concatenar nomes de variables ​​em C? Especificamente, eu tenho uma struct que contém 6 variables ​​similares chamadas class1 , class2 , class3 , etc.

Eu quero executar um loop for para atribuir a cada variável um valor, mas não consigo ver como fazer isso sem de alguma forma concatenar o nome da variável com o valor do contador de loop for.

Como mais eu poderia fazer isso?

Quando você se encontrar adicionando um sufixo inteiro aos nomes das variables, pense que eu deveria ter usado um array .

 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: Um compilador C ++ fará isso por causa da class . Você precisará descobrir um nome diferente para esse campo se planeja compilar esse código como C ++.

Existem linguagens dinâmicas onde você pode fazer esse tipo de coisa – C não é uma dessas linguagens. Eu concordo com Sinan – arrays ou vetores STL são o caminho a percorrer.

Como um experimento mental – o que aconteceria se você tivesse 100.000 dessas variables? Você teria 100.000 linhas de código para inicializá-las?

O pré-processador C pode concatenar símbolos, mas você considerou apenas usar uma matriz?

O que você também pode fazer é escrever uma implementação de um mapa de hash. Como o conjunto de chaves (que seria como nomes de variables) do mapa de hash não muda com o tempo, para cada mapa de hash você poderia manter uma matriz de suas chaves para iterar de forma eficiente. Mas isso seria um total (louco) exagero, especialmente em C;)

Quase tudo é possível em C, é uma ótima linguagem para aprender 🙂

talvez a regra de codificação segura CERT-C PRE05-C ‘Entenda a substituição de macro ao concatenar tokens ou executar a estratificação’ poderia ajudá-lo. Para obter detalhes detalhados, consulte este link: https://www.securecoding.cert.org/confluence/display/seccode/PRE05-C.+Understand+macro+replacement+when+concatenating+tokens+ou+performing+stringification .

Para resumir, defina primeiro uma macro JOIN_AGAIN (x, y) (x ## y) e depois JOIN (x, y) JOIN_AGAIN (x, y) A macro JOIN_AGAIN permite expandir o valor do contador de loops que será concatenado à macro. nome var.

Felicidades Pierre Bui