2009-12-02 2 views
6

Можно ли объединить имена переменных в C? В частности, у меня есть struct, который содержит 6 подобных переменные в нем называется class1, class2, class3 и т.д.Объединение переменных имен в C?

Я хочу запустить через цикл для присвоения каждого переменного значения, но я не могу видеть, как это сделать это без какого-либо сцепления имени переменной со значением счетчика цикла.

Как еще я мог это сделать?

ответ

43

Когда вы оказываетесь, добавив целочисленный суффикс имен переменных, думаю я должен использовать массив.

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; 
} 

Примечание: компилятор C++ будет блевать в этом из-за class. Вам нужно будет определить другое имя для этого поля, если вы планируете скомпилировать этот код как C++.

5

Есть динамические языки, где вы можете делать такие вещи - C не является одним из этих языков. Я согласен с Sinan - массивами или векторами STL - путь.

Как мысленный эксперимент - что произойдет, если у вас будет 100 000 этих переменных? У вас есть 100 000 строк кода для их инициализации?

+2

+1 Perl, например, позволяет использовать такие символические ссылки, но их использование ** сильно ** не рекомендуется. http://perl.plover.com/varvarname.html –

1

Препроцессор C может concatenate символов, но вы считали, что используете массив?

+2

Конкатенация препроцессора не будет работать, потому что если вы соедините «класс» с переменной цикла «i», вы создадите «classi», и компилятор будет жаловаться, что такой символ существует. – benzado

0

Что вы могли бы сделать, это написать реализацию хэш-карты. Поскольку набор ключей (которые будут похожи на имена переменных) хэш-карты со временем не изменятся, для каждой хэш-карты вы можете сохранить массив своих ключей для эффективного итерации. Но это было бы в общей сложности (сумасшедший) избыточна, особенно в C;)

Практически все возможно в C, это великий язык, чтобы узнать :)

0

возможно CERT-C обеспечить кодирование правила PRE05 -C «Понять макросмену при конкатенации жетонов или выполнении строения» может вам помочь. Для получения более подробной информации см. Ссылку: https://www.securecoding.cert.org/confluence/display/seccode/PRE05-C.+Understand+macro+replacement+when+concatenating+tokens+or+performing+stringification.

Для краткости, определяют первый макро JOIN_AGAIN (х, у) (х ## у) , а затем Join (х, у) JOIN_AGAIN (х, у) Макрос JOIN_AGAIN позволяет расширить значение couner петли который будет объединен с именем var.

Приветствия Pierre Буй

+0

Неправильно. Вы просто произведете 'classi'; препроцессор просто производит больше символов и не имеет ничего общего со значениями времени выполнения. – GManNickG

+0

Вы правы GMAN, спасибо за этот комментарий. oups, не очень хорошо проснулся в воскресенье утром. жаль, что вышлите неправильный ответ. Pierre Bui –