Pergunta

É possível concatenar nomes de variáveis ??em C? Especificamente, eu tenho um struct que contém 6 variáveis ??semelhantes no que chamou de class1, class2, class3, etc.

Eu quero correr através de um loop for para atribuir cada variável um valor, mas eu não posso ver como fazê-lo sem alguma forma concatenando o nome da variável com o valor do contador de loop.

De que outra forma eu poderia fazer isso?

Foi útil?

Solução

Quando você encontrar-se a adição de um sufixo inteiro para nomes de variáveis, pense 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: A C ++ compilador irá vomitar neste por causa de class. Você precisa descobrir um nome diferente para esse campo se você pretende compilar este código como C ++.

Outras dicas

Existem linguagens dinâmicas, onde você pode fazer esse tipo de coisa - C não é um desses idiomas. Concordo com Sinan - matrizes ou vetores STL são o caminho a percorrer

.

Como um experimento de pensamento - o que aconteceria se você tem 100.000 dessas variáveis? Será que você tem 100.000 linhas de código para inicializar-los?

A C pré-processador pode concatenate símbolos, mas você já pensou em usar apenas um array?

O que você também poderia fazer, é escrever uma implementação de um mapa de hash. Uma vez que o conjunto de chaves (que seria como nomes de variáveis) do mapa de hash não muda ao longo do tempo, para cada hash mapear você poderia manter uma variedade de suas chaves para a iteração de forma eficiente. Mas isso seria uma total (louco) um exagero, especialmente em C;)

Quase tudo é possível em C, é uma grande linguagem de aprender:)

talvez o CERT-C codificação seguras regra PRE05-C 'Entenda substituição macro quando concatenando fichas ou realizando stringification' poderia ajudá-lo. Para mais detalhes profundos têm uma olhada neste link: https://www.securecoding.cert.org/confluence/display/seccode/PRE05-C.+Understand+macro+replacement+when+concatenating+tokens+or+performing+stringification .

Para suma, definir primeiro um JOIN_AGAIN macro (x, y) (x ## y) e depois juntar-se (x, y) JOIN_AGAIN (x, y) A macro JOIN_AGAIN permite expandir o valor do couner circuito que será concatenado com o nome var.

Felicidades Pierre Bui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top