Передача значения переменной в макрос в C

Я пытаюсь передать значение переменной макро в C, но я не знаю, возможно ли это. Пример:

#include <stdio.h>

#define CONCVAR(_n) x ## _n

int main () {
   int x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
   int i;

   for (i = 0; i <= 9; i++) CONCVAR(i) = i*5;

   return 0;
}

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

CONCVAR(i) заменен на xi, а не x1 (если i == 1). Я знаю, как defines и macro работают, все дело в замене, но я хочу знать, если это так можно передать значение i вместо буквы i в макрос.

3 ответов


подставляя значение i в макрос невозможно, так как замены макросов происходят до компиляции кода. Если вы используете GCC, вы можете увидеть вывод предварительного процессора, добавив аргумент командной строки "-E " (обратите внимание, однако, что вы увидите, что все #include вставлены в ваш код.)

C является статическим языком, и вы не можете решить имена символов во время выполнения. Однако то, что вы пытаетесь достичь, возможно, если вы используете массив и ссылаетесь на элементы, использующие индексы. Как правило, если у вас много переменных, таких как x0, x1 и т. д., Вы, вероятно, должны использовать контейнер, такой как массив.


нет, потому что стоимостью of i существует только в времени. Расширение макроса происходит при времени компиляции.


нет, это не сработает. Предварительный процессор C / C++ - это просто текстовый процессор "предварительной компиляции". Таким образом, он работает с текстом, найденным в исходном коде.

вот почему он берет буквальный текст "i", передает его в ваш макрос, расширяя его в буквальный текст" xi " в вашем исходном коде. Затем это передается в компилятор. Затем компилятор начинает анализировать обработанный текст, находя литеральный токен "xi" как необъявленную переменную, идущую вверх брюхом в процесс.

вы можете взять пример исходного кода и передать его компилятору gcc (я использовал gcc под cygwin, например, вставив свой код в файл, который я назвал сутенер.c из-за отсутствия лучшего имени). Тогда вы получите следующее:

$ gcc pimp.c
pimp.c: In function `main':
pimp.c:9: error: `xi' undeclared (first use in this function)
pimp.c:9: error: (Each undeclared identifier is reported only once
pimp.c:9: error: for each function it appears in.)

короче говоря, нет, вы не можете этого сделать. Чтобы сделать это, предварительный процессор должен был бы выступать в качестве интерпретатора. C и C++ (как правило) не интерпретируются языками, а предварительный процессор не является интерпретатором. Мое предложение состояло бы в том, чтобы получить очень четкое представление о различиях между компиляторами и устными переводчиками (и между скомпилированными и интерпретируемыми языками.)

С уважением.