2015-01-26 67 views
3

如何处理C中的定义?它们是按行号顺序处理的吗?可以#define包含以前定义的变量吗?

例如,以下说法是否有效?

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

根据以前的定义,定义会有问题吗?

+3

为什么不自己尝试一下呢? – Cyclonecode 2015-01-26 17:54:58

+0

你是对的。我应该先尝试一下自己。 – Aman 2015-01-26 17:58:16

+1

你还应该让它把每个参数放在它自己的括号里,例如这里:'((ONE)+1)'。 – 2015-01-26 18:00:21

回答

4

是的,一个#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 
}; 
4

正在使用的时候他们在点处理,因此你的例子,甚至这

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

将工作。

2

的最佳方式是自行检查:

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; 
} 
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

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

相关问题