Передача значения переменной в макрос в 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++ (как правило) не интерпретируются языками, а предварительный процессор не является интерпретатором. Мое предложение состояло бы в том, чтобы получить очень четкое представление о различиях между компиляторами и устными переводчиками (и между скомпилированными и интерпретируемыми языками.)
С уважением.