gcc編譯階段打印宏定義的內容


背景

總所周知,代碼量稍微大一點的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))
                                         ^


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM