如何处理C中的定义?它们是按行号顺序处理的吗?可以#define包含以前定义的变量吗?
例如,以下说法是否有效?
#define ONE 1
#define TWO (ONE+1)
根据以前的定义,定义会有问题吗?
如何处理C中的定义?它们是按行号顺序处理的吗?可以#define包含以前定义的变量吗?
例如,以下说法是否有效?
#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
和所有为我工作!
test.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
所有进一步occurunces。因此,第二个宏变为
#define TWO (1+1)
这就是预处理器如何处理和应用它。
反向例如:
#define TWO (ONE+1)
#define ONE 1
也将起作用。为什么?那么,预处理器将采取第一个#define
,扫描代码TWO
的任何出现,并用(ONE+1)
代替它。然后到达第二#define
,并取代的ONE
所有出现,包括那些以前#define
到位,以1
我个人更喜欢前一种方法优于后者:它是预处理器显然更容易处理。
为什么不自己尝试一下呢? – Cyclonecode 2015-01-26 17:54:58
你是对的。我应该先尝试一下自己。 – Aman 2015-01-26 17:58:16
你还应该让它把每个参数放在它自己的括号里,例如这里:'((ONE)+1)'。 – 2015-01-26 18:00:21