#define 可以包含以前定义的变量吗?

Can #define include previously defined variables?

如何处理 C 中的定义?它们是按行号顺序处理的吗?

例如,下面的语句是否有效?

#define ONE  1
#define TWO  (ONE+1)

依赖于先前定义的定义会不会有任何问题?

是的,一个 #define 可以毫无问题地引用其他 #define 替换和宏。

此外,这些常量的表达式将保持常量表达式。

您的第二个表达式在文本上等同于文本中的 (ONE+1) 替换,对嵌套级别没有限制。换句话说,如果您稍后定义

#define THREE (TWO+1)

然后在作业中使用它i = THREE,你会得到

i = ((ONE+1)+1)

预处理后。

如果您打算将此技巧用于数值,常见的替代方法是使用具有特定值的 enum,即

enum {
    ONE = 1
,   TWO = ONE+1
,   THREE = TWO+1
,   ... // and so on
};

它们在使用时被处理,所以你举例甚至这个

#define TWO  (ONE+1)
#define ONE  1

会起作用。

最好的办法是自己检查:

g++ test.cpp 
gcc test.c

对于严格的编译器检查:

gcc test.c -pedantic

一切都对我有用!

测试.c/test.cpp

#include <stdio.h>

#define A 9
#define B A

int main()
{
    printf("%d\n",B);
    return 0;
}

编译器按照定义的顺序处理 #define-s。在每个 #define 得到处理后,预处理器然后继续处理此 #define 之后的所有文本,并在 #define 留下的状态下使用它。因此,在您的示例中:

#define ONE  1
#define TWO  (ONE+1)

它首先处理 #define ONE 1,用 1 替换所有进一步出现的 ONE。所以,第二个宏就变成了

#define TWO  (1+1)

这就是预处理器处理和应用它的方式。

反例:

#define TWO  (ONE+1)
#define ONE  1

也可以。为什么?好吧,预处理器将获取第一个 #define,扫描代码以查找任何出现的 TWO,并将其替换为 (ONE+1)。然后它到达第二个 #define,并将所有出现的 ONE 替换为 1。

我个人更喜欢前一种方法而不是后者:预处理器显然更容易处理。