假設(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
輸出如下:
圖中所示的 .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)推薦
評論