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