#define 指令中变量名称的声明是否定义明确?

Is the declaration of a variable name in a #define directive well defined?

如果我有以下代码:

#include <stdio.h>
#define VAR_NAME a_variable

int VAR_NAME = 42;

int main()
{
    printf("%i\n", VAR_NAME);
    printf("%i\n", a_variable);
    a_variable = 123;
    printf("%i\n", VAR_NAME);
    printf("%i\n", a_variable);

    return 0;
}

a_variable的声明是否定义明确?在我的系统上,声明了一个名为 a_variableint,但我是否必须担心备用编译器声明一个名为 VAR_NAMEint

顺便说一句,上面的代码输出如下:

42
42
123
123

编辑:

另外,如果前面的定义明确,我可以做下面的吗?

#define VAR_NAME a_variable
...
#define DECL_VAR int VAR_NAME

// Declare an int named a_variable
DECL_VAR;

do I have to worry about alternate compilers declaring an int named VAR_NAME?

不,您不必为此担心。除非有人将 VAR_NAME 重新定义为其他内容,否则您将始终得到一个名为 a_variable.

int

#define 指令在编译器开始处理代码之前由预处理器处理。当编译器“看到”你的代码时,那里没有 VAR_NAME,只有 a_variable 留在所有使用 VAR_NAME 的地方。

Furthermore, if the previous is well-defined, could I do the following?

#define DECL_VAR int VAR_NAME

是的,只要定义了 VAR_NAME,这也可以。

注意:它定义明确且符合标准的事实并不意味着使用这样的代码一定是个好主意,因为级联声明很难为您程序的人类读者阅读。

假设实现符合标准,预处理器将执行文本替换,因此 VAR_NAME 的每个实例都将扩展为 a_variable

有几个例外(例如,字符串文字中的宏不会展开)。但是,如果您在通常需要变量名的地方使用宏,扩展将如您所愿地工作。

还有必要避免保留标识符(标准保留供实现使用的标识符 - 即编译器和标准头文件)。例如,如果您为宏或保留的变量选择一个名称(例如,以下划线开头,后跟大写字母,例如 _VAR_NAME 而不是 VAR_NAME),则行为是未定义。

编辑原始问题后的编辑:是的,DECL_VAR 的扩展如您所愿。

不过我会提醒你不要做这些事情。这样的技巧不会带来很多好处,但会使您的代码更难理解(毕竟,很少有人知道 DECL_VAR; 在您的代码中意味着什么,除非他们知道您在玩宏)。越难理解的代码越难正确。