0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

嵌入式物联网开发 来源:嵌入式物联网开发 作者:嵌入式物联网开发 2022-08-31 13:07 次阅读

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

#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

输出如下:

img

图中所示的 .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)。

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

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

    关注

    87

    文章

    11300

    浏览量

    209404
  • 代码
    +关注

    关注

    30

    文章

    4786

    浏览量

    68552
  • 编译
    +关注

    关注

    0

    文章

    657

    浏览量

    32863
收藏 人收藏

    评论

    相关推荐

    Linux编程】如何使用gcc编译源代码时输出map文件

    Linux编程】如何使用gcc编译源代码时输出map文件
    的头像 发表于 08-15 14:08 8244次阅读
    【<b class='flag-5'>Linux</b><b class='flag-5'>编程</b>】如何使用<b class='flag-5'>gcc</b><b class='flag-5'>编译</b>源代码时输出map<b class='flag-5'>文件</b>?

    LinuxGCC编译

    一、Linux 下多文件编译 在上一篇 Linux 下的 C 编程我们知道了 Linux 下的
    的头像 发表于 09-11 15:18 2624次阅读
    <b class='flag-5'>Linux</b> 下<b class='flag-5'>GCC</b>的<b class='flag-5'>编译</b>

    Linux入门之二 GCC的基本使用方法

    和主要参数选项,更为详尽的资料可以参看Linux系统的联机帮助。 假定我们有一个程序名为test.c的C语言源代码文件,要生成一个可执行文件,最简单的办法就是∶
    发表于 05-26 15:38

    gcc编译通过但是arm-linux-gcc不能编译,以及如何下载文件到arm

    本人arm菜鸟,在编译C文件出现如下问题。(图片参见附件pdf,谢谢各位指点)Gcc编译可以成功,arm-linux-gcc
    发表于 11-02 10:57

    gcc&arm-linux-gcc编译过程详解

    ://t.elecfans.com/topic/20.html?elecfans_trackid=xybanner第1节_gcc编译器1_常用选项_编译过程详解gcc的使用方法
    发表于 04-03 17:16

    基于STM32芯片使用arm-none-eabi-gcc编译

    stm32芯片,需要自己搭建编译环境。本文将基于STM32芯片使用arm-none-eabi-gcc编译器,并使用工具makefile完成。二、编译文件介绍STM32工程建立,可以是在
    发表于 08-24 08:22

    arm-linux-gcc编译器的相关资料推荐

    选项arm-linux-gcc编译选项-o编译及链接,会生成一个exe可执行文件-Wall指定产生全部的警告信息-O/-O2/-O3数字越高
    发表于 12-27 06:58

    使用编译链里面aarch64-poky-linux-gcc进行编译文件怎么失败了

    使用编译链里面aarch64-poky-linux-gcc进行编译如下文件编译失败,使用其他平台编译
    发表于 12-30 06:24

    aarch64-linux-gnu-gcc能不能编译文件系统

    第一次用这样的开始环境,也是新手,虚拟机机已经有了aarch64-linux-gnu-gcc,这个只用来编译文件系统吗?如果自己写应用,是不是还要安装QT之类的环境?aarch64-linux-gnu-gcc能不能
    发表于 01-05 06:51

    Linux教程之如何对Linux系统下的gcc进行编程的基本使用教程

    GCC是由GNU之父Stallman所开发的linux下的编译器,GCC最初的全名是GNU C Compiler,之后,随着GCC支持的语言
    发表于 11-02 15:15 4次下载

    Linux下开发STM32 使用gcc-arm-none-eabi工具链编译生成bin、hex文件

    Linux下开发STM32:使用gcc-arm-none-eabi工具链编译生成bin、hex文件
    的头像 发表于 02-28 15:08 1.1w次阅读
    <b class='flag-5'>Linux</b>下开发STM32 使用<b class='flag-5'>gcc</b>-arm-none-eabi工具链<b class='flag-5'>编译</b><b class='flag-5'>生成</b>bin、hex<b class='flag-5'>文件</b>

    gcc的使用方法以及Linux gcc 的常用选项

    gcc的使用方法 gcc 【选项】文件gcc常用选项 gcc -v: 查看gcc
    的头像 发表于 10-22 14:42 3105次阅读

    什么是预编译

    预编译就是处理以#开头的指令,比如赋值#include包含的文件、#define宏定义的替换、条件编译等。预编译就是为编译前做准备工作的阶段
    发表于 01-13 13:52 0次下载
    什么是<b class='flag-5'>预编译</b>

    Linux中CMake的使用4-代码与编译文件单独存放

    本篇介绍当源文件编译文件独立存放时,如何编写CMakeLists.txt。
    的头像 发表于 09-22 08:57 1722次阅读
    <b class='flag-5'>Linux</b>中CMake的使用4-代码与<b class='flag-5'>编译文件</b>单独存放

    Linux使用gcc编译程序的语法

    01. 调试相关的宏 在Linux使用gcc编译程序的时候,对于调试的语句还具有一些特殊的语法。 gcc编译的过程中,会
    的头像 发表于 06-22 10:51 706次阅读