在C中将变量的值传递给宏

我试图将变量的值传递给C中的宏,但我不知道这是否可行。 例:

#include  #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)。 我知道如何定义和宏工作,它都是关于替换,但我想知道是否有可能将i的值传递给字母i而不是宏。

将宏的值替换为宏是不可能的,因为在编译代码之前会发生宏替换。 如果您正在使用GCC,则可以通过添加“-E”命令行参数来查看预处理器输出(但请注意,您将看到代码中插入了所有#include)。

C是一种静态语言,您无法在运行时决定符号名称。 但是,如果您使用数组并使用下标引用元素,那么您可以实现的目标是什么。 根据经验,如果你有许多变量,如x0,x1等,你可能应该使用像数组这样的容器。

不,因为i仅在运行时存在。 宏扩展发生在编译时

不,它不会起作用。 C / C ++预处理器只是一个“预编译”时间文本处理器。 因此,它对您的源代码中的文本进行操作。

这就是为什么,它需要文字文本“i”,将其传递到您的宏中,将其扩展为源代码中的文字文本“xi”。 然后它被传递到编译器。 编译器然后开始解析经过后处理的文本,找到文字标记“xi”作为未声明的变量,在此过程中逐渐消失。

您可以获取示例源代码并将其传递给gcc编译器(例如,我在cygwin下使用gcc,将代码粘贴到我命名为pimp.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 ++(通常)不是解释语言,预处理器不是解释器。 我的建议是清楚地了解编译器和解释器之间(以及编译语言和解释语言之间的差异)。

问候。