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

在C语言中将变量的值传递给宏,c,c-preprocessor,C,C Preprocessor,我试图将变量的值传递给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; } #包括 #定义CONCVAR(_n)x###n in

我试图将变量的值传递给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;
}
#包括
#定义CONCVAR(_n)x###n
int main(){
int x0,x1,x2,x3,x4,x5,x6,x7,x8,x9;
int i;

对于(i=0;i否,因为
i
的值仅在运行时存在。宏扩展发生在编译时。

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


C是一种静态语言,您无法在运行时确定符号名称。但是,如果您使用数组并使用下标引用元素,则您试图实现的目标是可能的。根据经验,如果您有许多变量,如x0、x1等,您可能应该使用类似数组的容器。

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

这就是为什么,它接受文本“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++是(通常)不解释的语言,而预处理器不是解释程序。我的建议是要非常清楚编译器和解释器之间的差异。(以及编译语言和解释语言之间。)


问候。

你应该简单地使用数组。它永远不会这样工作,即使这样,也没有什么可以从中学习的,除了它只是一个可怕的代码。如果你想在数组后面达到峰值,请使用指针代替(并为脚上的许多洞做好准备)@德尔南:这看起来更像是使用/理解<代码>>< >代码>,而不是使用数组,但我不确定。作为一个总的经验法则,每一个宏重新定义一个函数或使用参数,都是糟糕的编程实践。@ Lundin:它可以有它的用途。相当罕见,是的,在这种情况下,你可以考虑使用HIG。她的级别语言具有您正在模仿的功能,但与一些现实项目可能使用的三角图不同。@Lundin我知道这不是一个重要功能,但我很好奇。