是否在#define指令中声明了变量名称?

时间:2015-06-06 10:33:28

标签: c c-preprocessor variable-declaration

如果我有以下代码:

#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的声明是否定义明确?在我的系统上,声明了名为int的{​​{1}},但是我是否需要担心其他编译器声明名为a_variable的{​​{1}}?

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

int

编辑:

此外,如果前一个定义明确,我可以执行以下操作吗?

VAR_NAME

2 个答案:

答案 0 :(得分:8)

  

我是否需要担心备用编译器声明名为int的{​​{1}}?

不,你不必担心。除非有人将VAR_NAME重新定义为其他内容,否则您将始终获得名为VAR_NAME的{​​{1}}。

在编译器处理代码之前,

int指令由预处理器处理。当编译器“看到”您的代码时,其中没有a_variable,只有#define留在已使用VAR_NAME的所有位置。

  

此外,如果前一个定义明确,我可以执行以下操作吗?

a_variable

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

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

答案 1 :(得分:4)

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

有一些例外(例如字符串文字中的宏未展开)。但是,如果您在通常需要变量名称的位置使用宏,则扩展将按预期工作。

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

编辑原始问题后编辑:是的,DECL_VAR的扩展按预期工作。

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