對於大型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...