Как подставить буквенную часть к названию переменной?

Как подставить буквенную часть к названию переменной? Есть строчка fprintf(logfile," ");, как подставить к logfile еще буквенную часть? Примерно вида logfile_{}, где {} это буквенная часть?


Ответы (1 шт):

Автор решения: AnyKeyShik

Добро пожаловать в чудесный мир препроцессора С и его возможностей кодогенерации. Общий пример, что можно сделать:

#include <stdio.h>

#define FUNC(NAME, NUMBER)  NAME ##_## NUMBER

void print_hello(void)
{
    puts("Hello world!");
}

int main(void)
{
    FUNC(print, hello)();

    return 0;
}

Обьяснение, что за черная магия. Препроцессор - очень мощная штука, с помощью него можно делать буквально что угодно (хоть писать плюсовые шаблоны. Больно, но можно). В данном случае используется банальная конкатенация строк - вместо ## подставляются значения "аргументов", которые были переданы. То есть, в вашем случае, это будет выглядеть примерно так:

// Some code...

#define VAR(NAME, NUMBER)  NAME ##_## NUMBER

// Some code...

fprintf(VAR(logfile, 1),"");

Такая конструкция после препроцессинга будет восприниматься компилятором как fprintf(logfile_1,"");. Только остается проблема - в рантайме (то есть во время выполнения программы) так сделать не получится. Только на этапе препроцессинга. В вашем вопросе не очень понятно, в какой момент вы собираетесь менять название переменной, но если не в момент выполнения - данное решение может вам помочь

→ Ссылка