Объединение имен переменных в C?
Можно ли объединить имена переменных в C? В частности, у меня есть struct
который содержит 6 аналогичных переменных в нем называется class1
, class2
, class3
, так далее.
Я хочу запустить цикл for, чтобы присвоить каждой переменной значение, но я не могу понять, как это сделать, не связав имя переменной со значением счетчика цикла for.
Как еще я мог это сделать?
5 ответов
Когда вы добавляете к именам переменных целочисленный суффикс, подумайте, что мне следовало использовать массив.
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++.
Существуют динамические языки, где вы можете делать такие вещи - C не является одним из этих языков. Я согласен с Sinan - массивы или векторы STL - путь.
В качестве мысленного эксперимента - что произойдет, если у вас будет 100 000 этих переменных? У вас будет 100 000 строк кода для их инициализации?
Препроцессор C может объединять символы, но вы рассматривали только использование массива?
Что вы также можете сделать, это написать реализацию хэш-карты. Поскольку набор ключей (которые будут похожи на имена переменных) хэш-карты не изменяется со временем, для каждой хэш-карты вы можете сохранить массив ее ключей для эффективной итерации. Но это было бы полным (безумным) излишним, особенно в C;)
Практически все возможно в C, это отличный язык для изучения:)
Возможно, вам поможет правило безопасного кодирования 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(x,y) (x##y), а затем JOIN(x,y) JOIN_AGAIN(x,y) Макрос JOIN_AGAIN позволяет расширить значение счетчика цикла, который будет объединен в имя вар.
Ура Пьер Буи