gcc -E 预处理

 

前言

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 }

猜你喜欢

转载自blog.csdn.net/luoyir1997/article/details/82455058