# include <stdio.h>
# define ONE 1
# define TWO 2
# define ONE TWO
# define TWO ONE
int main ( void )
{
printf("ONE = %d, TWO = %d\n", ONE, TWO );
return 0;
}
当我们这样写的时候会发生什么?在第4行#define ONE TWO
,预处理器是否会立即将其替换为1 2
?
答案 0 :(得分:1)
如果您使用的是xcode 3,则可以右键单击该文件并选择PreProcess
您将在末尾附近获得一个包含此代码的大文件
int main ( void )
{
printf("ONE = %d, TWO = %d\n", ONE, TWO );
return 0;
}
编辑:我认为在这种情况下它没用。出于某种原因,预处理没有错误和警告,但代码不会改变。但是如果你编写有用的代码,你可以查看预处理的代码。
如果你尝试编译它,你会得到一堆警告和错误。
test.c:4:1: warning: "ONE" redefined
test.c:2:1: warning: this is the location of the previous definition
test.c:5:1: warning: "TWO" redefined
test.c:3:1: warning: this is the location of the previous definition
test.c: In function ‘main’:
test.c:8: error: ‘ONE’ undeclared (first use in this function)
test.c:8: error: (Each undeclared identifier is reported only once
test.c:8: error: for each function it appears in.)
test.c:8: error: ‘TWO’ undeclared (first use in this function)
答案 1 :(得分:0)
将调用哪个宏的冲突.....由于ONE为1而ONE为TWO ....这就是链接错误。
答案 2 :(得分:0)
在第4行
#define ONE TWO
,预处理器是否会立即将其替换为1 2
?
没有。在这种情况下,define
指令的相关形式是:
#define
标识符替换列表换行
......并且identifier
没有发生替换。此外,以下适用:
当前定义为类似对象宏的标识符不应由另一个
#define
预处理指令重新定义,除非第二个定义是类似于对象的宏定义且两个替换列表相同。
...这使您的重新定义非法。
如果您需要重新定义宏,则必须先使用#undef
取消定义。