那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【Linux編程】如何使用gcc生成預(yù)編譯文件?

嵌入式物聯(lián)網(wǎng)開發(fā) ? 來源:嵌入式物聯(lián)網(wǎng)開發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開發(fā) ? 2022-08-31 13:07 ? 次閱讀

假設(shè)我們有以下測試代碼:

#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;
}

我們都知道,【預(yù)編譯】過程主要是宏定義替換,那么我們想知道示例代碼中的宏被替換后是什么樣的,應(yīng)該怎么樣查看呢?

我們可以使用以下編譯命令輸出預(yù)編譯處理的文件。-o 表示輸出預(yù)編譯文件的文件名

gcc -E gcc_precompile.c -o gcc_precompile.i

輸出如下:

img

圖中所示的 .i 文件就是我們需要的預(yù)編譯處理之后的文件,它的內(nè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函數(shù)之前都是頭文件添加進來的,我們重點看main函數(shù)內(nèi)部,可以發(fā)現(xiàn),MAX_NUM被替換成了100;大名鼎鼎的Linux內(nèi)核max宏被成功替換 (文章有詳細(xì)介紹:【Linux內(nèi)核】從小小的宏定義窺探Linux內(nèi)核的精妙設(shè)計);malloc“函數(shù)”被成替換成了 ((void *)0),即NULL;myprintf自定義打印函數(shù)被成功替換了 do {} while(0)。

怎么樣,生成預(yù)編譯文件的技能你 ? 到了嗎?

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11345

    瀏覽量

    210391
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4825

    瀏覽量

    69046
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    661

    瀏覽量

    33040
收藏 人收藏

    評論

    相關(guān)推薦

    Linux編程】如何使用gcc編譯源代碼時輸出map文件

    Linux編程】如何使用gcc編譯源代碼時輸出map文件
    的頭像 發(fā)表于 08-15 14:08 ?8406次閱讀
    【<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 下的
    的頭像 發(fā)表于 09-11 15:18 ?2724次閱讀
    <b class='flag-5'>Linux</b> 下<b class='flag-5'>GCC</b>的<b class='flag-5'>編譯</b>

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

    和主要參數(shù)選項,更為詳盡的資料可以參看Linux系統(tǒng)的聯(lián)機幫助。 假定我們有一個程序名為test.c的C語言源代碼文件,要生成一個可執(zhí)行文件,最簡單的辦法就是∶
    發(fā)表于 05-26 15:38

    gcc編譯通過但是arm-linux-gcc不能編譯,以及如何下載文件到arm

    本人arm菜鳥,在編譯C文件出現(xiàn)如下問題。(圖片參見附件pdf,謝謝各位指點)Gcc編譯可以成功,arm-linux-gcc
    發(fā)表于 11-02 10:57

    gcc&arm-linux-gcc編譯過程詳解

    ://t.elecfans.com/topic/20.html?elecfans_trackid=xybanner第1節(jié)_gcc編譯器1_常用選項_編譯過程詳解gcc的使用方法
    發(fā)表于 04-03 17:16

    基于STM32芯片使用arm-none-eabi-gcc編譯

    stm32芯片,需要自己搭建編譯環(huán)境。本文將基于STM32芯片使用arm-none-eabi-gcc編譯器,并使用工具makefile完成。二、編譯文件介紹STM32工程建立,可以是在
    發(fā)表于 08-24 08:22

    arm-linux-gcc編譯器的相關(guān)資料推薦

    選項arm-linux-gcc編譯選項-o編譯及鏈接,會生成一個exe可執(zhí)行文件-Wall指定產(chǎn)生全部的警告信息-O/-O2/-O3數(shù)字越高
    發(fā)表于 12-27 06:58

    使用編譯鏈里面aarch64-poky-linux-gcc進行編譯文件怎么失敗了

    使用編譯鏈里面aarch64-poky-linux-gcc進行編譯如下文件編譯失敗,使用其他平臺編譯
    發(fā)表于 12-30 06:24

    aarch64-linux-gnu-gcc能不能編譯文件系統(tǒng)

    第一次用這樣的開始環(huán)境,也是新手,虛擬機機已經(jīng)有了aarch64-linux-gnu-gcc,這個只用來編譯文件系統(tǒng)嗎?如果自己寫應(yīng)用,是不是還要安裝QT之類的環(huán)境?aarch64-linux-gnu-gcc能不能
    發(fā)表于 01-05 06:51

    Linux教程之如何對Linux系統(tǒng)下的gcc進行編程的基本使用教程

    GCC是由GNU之父Stallman所開發(fā)的linux下的編譯器,GCC最初的全名是GNU C Compiler,之后,隨著GCC支持的語言
    發(fā)表于 11-02 15:15 ?4次下載

    Linux下開發(fā)STM32 使用gcc-arm-none-eabi工具鏈編譯生成bin、hex文件

    Linux下開發(fā)STM32:使用gcc-arm-none-eabi工具鏈編譯生成bin、hex文件
    的頭像 發(fā)表于 02-28 15:08 ?1.1w次閱讀
    <b class='flag-5'>Linux</b>下開發(fā)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
    的頭像 發(fā)表于 10-22 14:42 ?3164次閱讀

    什么是預(yù)編譯

    預(yù)編譯就是處理以#開頭的指令,比如賦值#include包含的文件、#define宏定義的替換、條件編譯等。預(yù)編譯就是為編譯前做準(zhǔn)備工作的階段
    發(fā)表于 01-13 13:52 ?0次下載
    什么是<b class='flag-5'>預(yù)編譯</b>

    Linux中CMake的使用4-代碼與編譯文件單獨存放

    本篇介紹當(dāng)源文件編譯文件獨立存放時,如何編寫CMakeLists.txt。
    的頭像 發(fā)表于 09-22 08:57 ?1777次閱讀
    <b class='flag-5'>Linux</b>中CMake的使用4-代碼與<b class='flag-5'>編譯文件</b>單獨存放

    Linux使用gcc編譯程序的語法

    01. 調(diào)試相關(guān)的宏 在Linux使用gcc編譯程序的時候,對于調(diào)試的語句還具有一些特殊的語法。 gcc編譯的過程中,會
    的頭像 發(fā)表于 06-22 10:51 ?757次閱讀
    现场百家乐平台源码| 皇冠网百家乐官网赢钱| 百家乐赌博代理| 诚信百家乐官网平台| 大发888官方体育| 百家乐官网筹码14克粘土| 德州扑克术语| 查看百家乐赌博| 和记娱乐开户| 皇冠百家乐赢钱皇冠| 百家乐官网筹码币方形| 大发888下载免费游戏| 百家乐官网事一箩筐的微博| 双鸭山市| 威尼斯人娱乐城玩百家乐| 查找百家乐官网群| 百家乐官网公式计算| 百家乐博彩吧| 百家乐官网送现金| 香港六合彩大全| 百家乐轮盘| 汇丰百家乐官网的玩法技巧和规则| 灌南县| 新全讯网321| 百家乐群东方鸿运| 百家乐官网龙虎的投注法| 皇冠现金网信誉| 優博百家乐客服| 百家乐官网游戏免费试| 十六蒲娱乐城| 威尼斯人娱乐城会员开户| 百家乐平台租用| 百家乐官网投注之对冲投注| 卡迪拉娱乐| 赌百家乐的玩法技巧和规则 | 58百家乐的玩法技巧和规则| 杨筠松 24山| 澳门百家乐官网洗码提成查询| 新盈国际| 威尼斯人娱乐网站怎么样| 百家乐官网百乐发破解版|