編譯階段列印巨集內容

2021-06-15 01:39:46 字數 1492 閱讀 8992

對於大型c/c++工程,由於巨集定義可能散落在各個標頭檔案和makefile當中。同時條件編譯又是大型工程常用的技巧,所以巨集定義的大量存在,給**閱讀增加了難度,如果搞不清楚巨集定義的情況就無法掌握程式的執行流程。最簡單的辦法就是使用printf來列印這些巨集,但是如果是帶引數的巨集就比較麻煩了。而且如果使用printf必須重新編譯程式,並執行,當我們閱讀的是核心原始碼或驅動程式,那重新執行的代價是相當可觀的。如果在編譯階段可以列印巨集的內容就可以省去這些麻煩。以下內容就闡述一種可行的方法。

首先介紹#pragma message 。 它能夠在編譯資訊輸出視窗中輸出相應的資訊,這對於源**資訊的控制是非常重要的。其使用方法為:

#pragma message(「訊息文字」)

當編譯器遇到這條指令時就在編譯輸出視窗中將訊息文字列印出來。

當我們在程式中定義了許多巨集來控制源**版本的時候,我們自己有可能都會忘記有沒有正確的設定這些巨集,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在源**的什麼地方定義了_x86這個巨集可以用下面的方法:

#ifdef _x86

#pragma message(「_x86 macro activated!」)

#endif

當我們定義了_x86這個巨集以後,應用程式在編譯時就會在編譯輸出視窗裡顯示「_x86 macro activated!」。

有時候不僅希望知道巨集是否定義了,而且希望知道巨集定義的內容,#可以將巨集展開為字串,下面的示例演示如何在編譯階段列印巨集內容。

//兩個用於測試的巨集

#define pi 3.1415926

#define max(a,b) (a)>(b) ? (a) :(b)

//首先定義兩個輔助巨集

#define   print_macro_helper(x)   #x 

#define   print_macro(x)   #x"="print_macro_helper(x) 

//編譯階段列印巨集內容

#pragma message(print_macro(pi))

#pragma message(print_macro(pi2))

#pragma message(print_macro(max(a,b)))

#pragma message(print_macro(max(x,y)))

結果輸出

note: #pragma message: pi=3.1415926  

//print_macro中的兩個x都被替換為pi,print_macro_helper中的#x替換為巨集pi的內容

note: #pragma message: pi2=pi2          

//pi2不存在的情況下print_macro_helper將#x換做pi2

note: #pragma message: max(a,b)=(a)>(b) ? (a) :(b)

note: #pragma message: max(x,y)=(x)>(y) ? (x) :(y)

以上**:編譯階段列印巨集內容

編譯階段列印巨集內容

兩個用於測試的巨集 define pi 3.1415926 define max a,b a b a b 首先定義兩個輔助巨集 define print macro helper x x define print macro x x print macro helper x 編譯階段列印巨集內容 p...

巨集定義和巨集編譯

以下是巨集定義的一些用法11.4.2 if defined else endif 此編譯指令為 ifdef else endif的等價編譯指令。其語法格式如下 if defined 常量表示式 段1 else 段2 endif 或 if defined 常量表示式 段1 else 段2 endif ...

利用巨集控制列印

利用巨集控制列印 在程式除錯時,我們經常需要輸出一些除錯資訊,當除錯完畢後,就不再需要使用了。那怎麼快速的在除錯狀態和發布狀態切換呢?通常我們使用預編譯加巨集定義來處理這個問題,例如 ifdef debug 除錯 endif 如果我們使用printf來顯示一些除錯資訊,那麼每個地方都加上 ifdef...