#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。
我个人更喜欢前一种方法而不是后者:预处理器显然更容易处理。
如何处理 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。
我个人更喜欢前一种方法而不是后者:预处理器显然更容易处理。