Объединение имен переменных в 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 позволяет расширить значение счетчика цикла, который будет объединен в имя вар.

Ура Пьер Буи

Другие вопросы по тегам