【Linux编程】如何使用gcc生成预编译文件?

描述

假设我们有以下测试代码:

#include 

#define max(x,y) ({\
		typeof(x) _x = (x);\
		typeof(y) _y = (y);\
		(void) (&_x == &_y);\
		_x > _y ? _x : _y;\
		})

#define MAX_NUM	                    100

#define malloc(n)                    (NULL)

#define myprintf(fmt, arg...)	    do {} while(0)


int main(int argc, const char **argv)
{
	int x=3, y=4;
	int *p;
	printf("MAX_NUM=%d\n", MAX_NUM);
	printf("max(x,y)=%d\n", max(x,y));
	p = malloc(10);
	myprintf("p=%p\n", p);
	return 0;
}

我们都知道,【预编译】过程主要是宏定义替换,那么我们想知道示例代码中的宏被替换后是什么样的,应该怎么样查看呢?

我们可以使用以下编译命令输出预编译处理的文件。-o 表示输出预编译文件的文件名

gcc -E gcc_precompile.c -o gcc_precompile.i

输出如下:

编译

图中所示的 .i 文件就是我们需要的预编译处理之后的文件,它的内容如下所示:

extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 942 "/usr/include/stdio.h" 3 4

# 4 "gcc_precompile.c" 2
# 20 "gcc_precompile.c"

# 20 "gcc_precompile.c"
int main(int argc, const char **argv)
{
 int x=3, y=4;
 int *p;
 printf("MAX_NUM=%d\n", 100);
 printf("max(x,y)=%d\n", ({ typeof(x) _x = (x); typeof(y) _y = (y); (void) (&_x == &_y); _x > _y ? _x : _y; }));
 p = (
# 26 "gcc_precompile.c" 3 4
    ((void *)0)
# 26 "gcc_precompile.c"
    );
 do {} while(0);
 return 0;
}

main函数之前都是头文件添加进来的,我们重点看main函数内部,可以发现,MAX_NUM被替换成了100;大名鼎鼎的Linux内核max宏被成功替换 (文章有详细介绍:【Linux内核】从小小的宏定义窥探Linux内核的精妙设计);malloc“函数”被成替换成了 ((void *)0),即NULL;myprintf自定义打印函数被成功替换了 do {} while(0)。

怎么样,生成预编译文件的技能你 ✔ 到了吗?
 

 审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分