将变量的值传递给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)。我知道如何定义和宏工作,它都是关于替换,但我想知道是否可以将i的值而不是字母
i
传递给宏。     
已邀请:
将宏value的值替换为宏是不可能的,因为在代码编译之前会发生宏替换。如果您正在使用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 ++(通常)不是解释语言,预处理器不是解释器。我的建议是要清楚地了解编译器和解释器之间(以及编译语言和解释语言之间的差异)。 问候。     

要回复问题请先登录注册