1. 程式人生 > >gcc編譯階段列印巨集定義的內容

gcc編譯階段列印巨集定義的內容

# 背景 總所周知,程式碼量稍微大一點的C/C++專案的一些巨集定義都會比較複雜,有時候會巢狀多個`#if`/`#else`判斷分支和一堆`#ifdef`/`#undef`讓你單看程式碼的話很難判斷出巨集定義的具體內容。 如果有一種機制能夠幫助我們在構建期間打印出巨集的實際內容,就能幫我們更快地捋清楚程式碼邏輯。 # message pragma 如`message pragma`[定義](https://docs.microsoft.com/en-us/cpp/preprocessor/message?view=msvc-160)所說,可以使用它來列印一個字面意義的字串: ```C++ #pragma message("訊息文字") ``` 而我們知道巨集定義裡可以使用`#`將巨集定義[字串化](https://docs.microsoft.com/en-us/cpp/preprocessor/stringizing-operator-hash?view=msvc-160);借用這種機制我們可以將使用如下巨集定義來便捷地在編譯期間列印巨集定義: ```C++ #define PRINT_MACRO_HELPER(x) #x #define PRINT_MACRO(x) #x"="PRINT_MACRO_HELPER(x) #pragma message(PRINT_MACRO(YOUR_MACRO)) ``` 如果`YOUR_MACRO`是有被定義的,則列印: ```Bash note: #pragma message: YOUR_MACRO=xxx ``` 若`YOUR_MACRO`未定義,則列印: ```Bash note: #pragma message: YOUR_MACRO=YOUR_MACRO ``` 舉個栗子: 編譯`test_macro_msg.cpp`: ```C++ #include #define PRINT_MACRO_HELPER(x) #x #define PRINT_MACRO(x) #x "=" PRINT_MACRO_HELPER(x) #define NUMBER_MACRO 3.14159 #define STRING_MACRO "This is a string." #pragma message(PRINT_MACRO(NUMBER_MACRO)) #pragma message(PRINT_MACRO(STRING_MACRO)) #pragma message(PRINT_MACRO(UNDEF_MACRO)) int main(int argc, char** argv) { return 0; } ``` 編譯過程中輸出: ```Bash > g++ cstr2string.cpp -o cstr2string cstr2string.cpp:9:42: note: #pragma message: NUMBER_MACRO=3.14159 #pragma message(PRINT_MACRO(NUMBER_MACRO)) ^ cstr2string.cpp:10:42: note: #pragma message: STRING_MACRO="This is a string." #pragma message(PRINT_MACRO(STRING_MACRO)) ^ cstr2string.cpp:11:41: note: #pragma message: UNDEF_MACRO=UNDEF_MACRO #pragma message(PRINT_MACRO(UNDEF_MACRO))