【发布时间】:2010-07-22 23:30:42
【问题描述】:
可能重复:
How can I make the preprocessor insert linebreaks into the macro expansion result?
#define IDENTIFIER { /*new line here*/\
my_multiline(); /*new line here*/\
macro(); /*new line here*/\
} /*new line here*/
我可以强制 C 预处理器在它的扩展中生成一个新行吗?我不相信有一个标准的方法可以做到这一点,但我不介意针对 Visual C++ (2008) 和 gcc 的平台特定黑客。
我对通过 m4 或单独的预处理器执行此操作不感兴趣。
我为什么要问这个:
这或多或少只是好奇心。由于这是一个 hack,我不会在生产中尝试这个,但我想知道我是否能够做到这一点。几天前我偶然发现了这个问题:
Can you turn off (specific) compiler warnings for any header included from a specific location?
这是一个我自己想要解决的问题。我考虑过创建一个包含标题的宏,但使用正确的编译指示在包含之前禁用警告,包含我想关闭警告的标题,在包含之后启用警告。
当然,我可以创建一个脚本来生成模拟包含,其中包含警告和包含的编译指示。
我的第一个问题是,由于#include 是预处理器指令,因此生成它的宏会有点无用。但后来我找到了这个答案:
Is there a way to do a #define inside of another #define?
如果我能够强制编译器在其扩展中生成换行符,我相信我可以生成特殊的包含宏。
我现在在家,但我明天上班时会发布我的代码。
【问题讨论】:
-
您的
#define需要一个标识符。无论如何,空格的用途是什么?你永远不会看到扩展的代码。 -
@GMan:他可能只是希望宏本身更具可读性。
-
您能否提供一些背景信息,说明您为什么希望它这样做?您是否正在尝试编写特定的宏?也许您的问题有不同的解决方案。
-
@CookieOfFortune:但是他几乎可以做他现在所拥有的,C++ 不关心空格。只需要在行尾的反斜杠来指示宏在他已经拥有的下一行继续。
-
没有可移植或标准的方法来做到这一点。在评估预处理指令后,换行符不重要,因此没有理由保留它们。
标签: c++ c-preprocessor