背景

总所周知,代码量稍微大一点的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))
                                         ^
12-21 01:23