假設我們有以下測試代碼:
#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)。
怎么樣,生成預編譯文件的技能你 ? 到了嗎?
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
Linux
+關注
關注
87文章
11322瀏覽量
209857 -
代碼
+關注
關注
30文章
4803瀏覽量
68750 -
編譯
+關注
關注
0文章
659瀏覽量
32911
發布評論請先 登錄
相關推薦
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使用gcc編譯程序的語法
01. 調試相關的宏 在Linux使用gcc編譯程序的時候,對于調試的語句還具有一些特殊的語法。 gcc編譯的過程中,會
評論