對於大型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)
以上轉自:編譯階段打印宏內容