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

时间:2011-02-16 15:03:23

标签: 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;
}

在这里,我正在尝试使用宏为所有x_变量赋值,使用##标记。我知道我可以通过数组轻松实现这一点,但这仅用于学习目的。

CONCVAR(i)替换为xi,而非x1(如果i == 1)。我知道如何定义和宏工作,它都是关于替换的,但我想知道是否可以将i的值而不是字母i传递给宏。

3 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:9)

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

答案 2 :(得分:1)

不,它不会起作用。 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 ++(通常)不是解释语言,预处理器不是解释器。我的建议是要清楚地了解编译器和解释器之间(以及编译语言和解释语言之间的差异)。

问候。

相关问题