假設(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](https://file.elecfans.com//web2/M00/66/26/poYBAGMO7JKAAVv3AAB2OQ_1wos463.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6dWxsYw==,size_16,color_FFFFFF,t_70)
圖中所示的 .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ù)編譯文件的技能你 ? 到了嗎?
-
Linux
+關(guān)注
關(guān)注
87文章
11345瀏覽量
210391 -
代碼
+關(guān)注
關(guān)注
30文章
4825瀏覽量
69046 -
編譯
+關(guān)注
關(guān)注
0文章
661瀏覽量
33040
發(fā)布評論請先 登錄
相關(guān)推薦
Linux入門之二 GCC的基本使用方法
gcc編譯通過但是arm-linux-gcc不能編譯,以及如何下載文件到arm
gcc&arm-linux-gcc編譯過程詳解
基于STM32芯片使用arm-none-eabi-gcc編譯器
arm-linux-gcc編譯器的相關(guān)資料推薦
使用編譯鏈里面aarch64-poky-linux-gcc進行編譯文件怎么失敗了
aarch64-linux-gnu-gcc能不能編譯文件系統(tǒng)
Linux教程之如何對Linux系統(tǒng)下的gcc進行編程的基本使用教程
Linux下開發(fā)STM32 使用gcc-arm-none-eabi工具鏈編譯生成bin、hex文件
![<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>](https://file.elecfans.com/web1/M00/B4/E7/pIYBAF5YvAeASddCAAF6pcnebhI564.png)
什么是預(yù)編譯
![什么是<b class='flag-5'>預(yù)編譯</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論