如何编写扩展为包含换行符的cpp宏?
我正在开发一个涉及大量预处理器宏函数的大型项目,以合成任何不能被模板替换的代码.相信我,我熟悉各种模板技巧,但只要没有可以直接创建代码的标准化,类型安全的元编程语言,我们就必须坚持使用旧的预处理器及其繁琐的宏来解决一些问题.如果没有,则需要写十倍以上的代码.一些宏跨越许多行,并且在预处理代码中很难读取.因此,我想到了解决这个问题的方法,我想出的是以下内容:
假设我们有一个跨越多行的C/C++宏,例如在一个名为MyMacro.hpp的文件中
// Content of MyMacro.hpp #include "MultilineMacroDebugging.hpp" #define PRINT_VARIABLE(S) \ __NL__ std::cout << #S << ": " << S << std::endl; \ __NL__ /* more lines if necessary */ \ __NL__ /* even more lines */
在我定义这样一个宏的每个文件中,我包含另一个文件MultilineMacroDebugging.hpp,其中包含以下内容:
// Content of MultilineMacroDebugging.hpp #ifndef HAVE_MULTILINE_DEBUGGING #define __NL__ #endif
这定义了一个空宏__NL__
,它使__NL__
定义在预处理期间消失.然后可以在某处使用宏,例如在名为MyImplementation.cpp的文件中.
// Content of MyImplementation.cpp // Uncomment the following line to enable macro debugging //#define HAVE_MULTILINE_DEBUGGING #include "MyMacro.hpp" int a = 10; PRINT_VARIABLE(a)
如果我需要调试PRINT_VARIABLE
宏,我只需取消注释HAVE_MULTILINE_DEBUGGING
在MyImplementation.cpp中定义宏的行.结果代码当然不能编译,因为__NL__
宏结果是未定义的,这导致它保留在编译的代码中,但是它可以被预处理.
现在关键的一步是__NL__
使用你最喜欢的文本编辑器用换行符替换预处理器输出中的字符串,瞧,你最终得到了预处理后被替换的宏的结果的可读表示,它类似于编译器看到的内容,除了用于人为引入的换行符.
C&C++编译器会忽略未加引号的空格(除了>>模板问题),因此获取宏来发布换行符并没有多大意义.您可以通过使用反斜杠结束宏的每一行来使宏跨越多行,但这不会输出换行符.
这不可能.只有在查看列表文件或预处理器输出时才有意义.
编写宏以使其更易于阅读的常用技巧是使用\字符将宏继续到下一行.
我(相信我)已经看到编译器在列表输出的扩展宏中包含新行 - 为了您的利益.这只适用于阅读扩展宏的穷人,试图了解我们真正要求编译器做什么.它对编译器没有任何影响.
C&C++语言以相同的方式处理字符串之外的所有空格.就像一个分隔符.