众所周知,程序编译过程一般分为预处理,编译,汇编,链接四个过程。而编译预处理一般主要做3件事:宏扩展,去掉注释,和合并头文件。最近遇到了关于宏扩展和合并头文件执行顺序的讨论,根据牛人的说法,应该是先合并头文件,然后开始宏扩展。
一听到这个结论的时候,我心里就产生了疑问,但是因为当时不确信,就没有当场质疑“权威”。我心里的疑问是想象中的这样一段代码:
//test1.cpp
#define head <stdio.h>
#include head
int main(){
printf("test1.cpp/n");
return 0;
}
我在想,如果先合并头文件,则编译在开始就会报错,于是经过上机测试一把,发现居然编译顺利进行,于是我对“权威”的结论表示了质疑,毫无疑问就给他发了一封邮件。不多久,就从“权威”处得到答案。权威到底是权威,不佩服不行,嘿嘿。
原来,上面的这段代码可以看作是一个特例,或者说异常。为什么这么说?
include头文件声明有三种形式:
1. #include <h-char-sequence> new-line
2. #include "q-char-sequence" new-line
3. #include pp-tokens new-line
对于第三种(也就是程序test1中使用的方式),C/C++标准是允许的,并且这种格
一听到这个结论的时候,我心里就产生了疑问,但是因为当时不确信,就没有当场质疑“权威”。我心里的疑问是想象中的这样一段代码:
//test1.cpp
#define head <stdio.h>
#include head
int main(){
printf("test1.cpp/n");
return 0;
}
我在想,如果先合并头文件,则编译在开始就会报错,于是经过上机测试一把,发现居然编译顺利进行,于是我对“权威”的结论表示了质疑,毫无疑问就给他发了一封邮件。不多久,就从“权威”处得到答案。权威到底是权威,不佩服不行,嘿嘿。
原来,上面的这段代码可以看作是一个特例,或者说异常。为什么这么说?
include头文件声明有三种形式:
1. #include <h-char-sequence> new-line
2. #include "q-char-sequence" new-line
3. #include pp-tokens new-line
对于第三种(也就是程序test1中使用的方式),C/C++标准是允许的,并且这种格