C #define指令中变量名的声明是否定义良好?

C #define指令中变量名的声明是否定义良好?,c,c-preprocessor,variable-declaration,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); re

如果我有以下代码:

#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;
}
编辑:

此外,如果前面的定义很好,我可以做以下操作吗

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

// Declare an int named a_variable
DECL_VAR;
#define DECL_VAR int VAR_NAME
我是否需要担心替代编译器声明名为
VAR\u NAME
int

不,你不必为此担心。除非有人将
VAR\u NAME
重新定义为其他变量,否则您将始终得到一个
int
命名的
a\u变量

#define
指令在编译器处理代码之前由预处理器处理。当编译器“看到”您的代码时,那里没有
VAR\u NAME
,只有
VAR\u NAME
被使用的所有地方都留下了
VAR\u变量

此外,如果前面的定义很好,我可以做以下操作吗

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

// Declare an int named a_variable
DECL_VAR;
#define DECL_VAR int VAR_NAME
是的,只要定义了
VAR\u NAME
,这也会起作用


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

假设实现符合标准,预处理器将执行文本替换,因此
VAR\u NAME
的每个实例都将扩展为
a\u变量

有两个例外(例如,字符串文本中的宏未展开)。但是,如果在通常需要变量名的地方使用宏,则扩展将按预期工作

还必须避免保留标识符(标准为实现保留的标识符,即编译器和标准头)。例如,如果为宏或保留的变量选择名称(例如,以下划线开头,后跟大写字母,例如
\u VAR\u name
,而不是
VAR\u name
),则行为未定义

编辑以下原始问题的编辑:是的,
DECL\u VAR
的扩展如您所期望的那样工作

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