当前位置:  开发笔记 > 编程语言 > 正文

如何在cpp宏中生成换行符?

如何解决《如何在cpp宏中生成换行符?》经验,为你挑选了3个好方法。

如何编写扩展为包含换行符的cpp宏?



1> Florian Flei..:

我正在开发一个涉及大量预处理器宏函数的大型项目,以合成任何不能被模板替换的代码.相信我,我熟悉各种模板技巧,但只要没有可以直接创建代码的标准化,类型安全的元编程语言,我们就必须坚持使用旧的预处理器及其繁琐的宏来解决一些问题.如果没有,则需要写十倍以上的代码.一些宏跨越许多行,并且在预处理代码中很难读取.因此,我想到了解决这个问题的方法,我想出的是以下内容:

假设我们有一个跨越多行的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_DEBUGGINGMyImplementation.cpp中定义宏的.结果代码当然不能编译,因为__NL__宏结果是未定义的,这导致它保留在编译的代码中,但是它可以被预处理.

现在关键的一步是__NL__使用你最喜欢的文本编辑器用换行符替换预处理器输出中的字符串,瞧,你最终得到了预处理后被替换的宏的结果的可读表示,它类似于编译器看到的内容,除了用于人为引入的换行符.



2> Mike Thompso..:

C&C++编译器会忽略未加引号的空格(除了>>模板问题),因此获取宏来发布换行符并没有多大意义.您可以通过使用反斜杠结束宏的每一行来使宏跨越多行,但这不会输出换行符.


如果您想检查预处理代码,这实际上是有意义的.然后换行将有助于评估它是否正确用于调试目的.
为什么这个答案得到了回报?它没有回答这个问题.
@DavidBaird Ditto.答案并没有真正解决这个问题.

3> itj..:

这不可能.只有在查看列表文件或预处理器输出时才有意义.

编写宏以使其更易于阅读的常用技巧是使用\字符将宏继续到下一行.

我(相信我)已经看到编译器在列表输出的扩展宏中包含新行 - 为了您的利益.这只适用于阅读扩展宏的穷人,试图了解我们真正要求编译器做什么.它对编译器没有任何影响.

C&C++语言以相同的方式处理字符串之外的所有空格.就像一个分隔符.


"只有在查看列表文件或预处理器输出时才会有用." 那就是,嗯,就像问题的重点:)
推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有