前言
1.预处理是啥?
2.预处理阶段改变了啥?
3.c文件预处理后是什么文件?
要点
命令:gcc -E hello.c -o hello.i
预处理是读取c源程序,对其中的伪指令(以#开头的指令,也就是宏)和特殊符号进行“替代”处理;经过此处理,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,仍然是C文件。但内容有所不同。
伪指令主要包括以下三个方面:
(1)宏定义指令,如#define Name TokenString,#undef以及编译器内建的一些宏,如__DATE__, __FILE__, __LINE__, __TIME__, __FUNCTION__ 等。
(2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif等。
(3) 头文件包含指令,如#include "FileName"或者#include <FileName>等。
举例
一、新建一个.c文件,在文件中加入伪指令以及注释“我真可爱”,如下
[luoyiran@luoyiran ~]$ vim test.c
1 /*************************************************************************
2 > File Name: test.c
3 > Author:luoyiran
4 > Mail:[email protected]
5 > Created Time: 2018年09月05日 星期三 13时32分25秒
6 ***********************************************************************/
7
8 #include<stdio.h>
9 #define MAX 10
10
11
12
13
14 int main(int argc, char **argv)
15 {
16 int a = MAX;//我真可爱
17 #ifdef APP
18 a++;
19 #endif
20
21 printf("a=%d\n %s\n",a,__FILE__);
22 return 0;
23 }
~
~
二、预处理test.c文件,并输出到test.I文件中
扫描二维码关注公众号,回复:
3208381 查看本文章
[luoyiran@luoyiran ~]$ gcc test.c -E -o test.i
[luoyiran@luoyiran ~]$ vim test.i
进入test.i文件
这个文件大概有870行,前853行都是在处理#include<stdio.h>
1 # 1 "test.c"
2 # 1 "<built-in>"
3 # 1 "<命令行>"
4 # 1 "test.c"
5
6
7
8
9
10
11
12 # 1 "/usr/include/stdio.h" 1 3 4
13 # 28 "/usr/include/stdio.h" 3 4
14 # 1 "/usr/include/features.h" 1 3 4
15 # 361 "/usr/include/features.h" 3 4
16 # 1 "/usr/include/sys/cdefs.h" 1 3 4
17 # 373 "/usr/include/sys/cdefs.h" 3 4
18 # 1 "/usr/include/bits/wordsize.h" 1 3 4
19 # 374 "/usr/include/sys/cdefs.h" 2 3 4
20 # 362 "/usr/include/features.h" 2 3 4
21 # 385 "/usr/include/features.h" 3 4
22 # 1 "/usr/include/gnu/stubs.h" 1 3 4
23
24
25
26 # 1 "/usr/include/bits/wordsize.h" 1 3 4
27 # 5 "/usr/include/gnu/stubs.h" 2 3 4
28
如何跳转到行尾?命令行模式下:G,行首:g
.........
后几行就呈现出预处理过的test.c
848
849 extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__)) ;
850
851
852 extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__));
853 # 938 "/usr/include/stdio.h" 3 4
854
855 # 9 "test.c" 2
856
857
858
859
860
861 int main(int argc, char **argv)
862 {
863 int a = 10;//发现此时已经做了简单替换,把宏里的MAX=10替换换到了主函数中,注释被干掉了
864 // 发现条件编译#ifdef APP a++; #endif 不见了,“a++;”这条语句被优化掉了
865 //若在原.C文件中宏定义写成:#define APP a++; #endif,此时就会出现a++;
866
867
868 printf("a=%d\n %s\n",a,"test.c");//发现__FILE__被替换成了test.c
869 return 0;
870 }