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

Suiyek發表於2020-12-20

背景

總所周知,程式碼量稍微大一點的C/C++專案的一些巨集定義都會比較複雜,有時候會巢狀多個#if/#else判斷分支和一堆#ifdef/#undef讓你單看程式碼的話很難判斷出巨集定義的具體內容。
如果有一種機制能夠幫助我們在構建期間列印出巨集的實際內容,就能幫我們更快地捋清楚程式碼邏輯。

message pragma

message pragma定義所說,可以使用它來列印一個字面意義的字串:

#pragma message("訊息文字")

而我們知道巨集定義裡可以使用#將巨集定義字串化;借用這種機制我們可以將使用如下巨集定義來便捷地在編譯期間列印巨集定義:

#define    PRINT_MACRO_HELPER(x)  #x
#define    PRINT_MACRO(x)         #x"="PRINT_MACRO_HELPER(x)

#pragma message(PRINT_MACRO(YOUR_MACRO))

如果YOUR_MACRO是有被定義的,則列印:

note: #pragma message: YOUR_MACRO=xxx

YOUR_MACRO未定義,則列印:

note: #pragma message: YOUR_MACRO=YOUR_MACRO

舉個例子:
編譯test_macro_msg.cpp:

#include <iostream>

#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;
}

編譯過程中輸出:

> 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))
                                         ^

相關文章