【问题标题】:Can I force the C pre processor to generate a new line? [duplicate]我可以强制 C 预处理器生成一个新行吗? [复制]
【发布时间】: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


【解决方案1】:

如果您只是想让代码在调试器中更具可读性,您可以使用inline 函数而不是#defined 宏。不幸的是,inline 关键字是 C99 对 C 的补充,仅受 ANSI C 下的专有扩展(如 MSVC)支持。

#if __STDC_VERSION__ < 199901L
# if defined(_MSC_VER)
#  define inline __inline
# elseif defined(__GNUC__)
#  define inline __inline__
# endif
#endif

static inline void IDENTIFIER() {
    my_multiline();
    macro();
}

这还有一个额外的好处是可以进行类型检查(并且通常不太容易出错)。

【讨论】:

  • 不要去宏开心,你会后悔的。等一下。你不会后悔的,但是你之后的维护程序员会诅咒你曾经触碰过代码的那一天。 :)
  • @C Johnson:除非这种情况下的“维护程序员”是你自己。
  • +1 for inline .... 我不喜欢你的回答中上面#defined 中的最后一个“d” ;-)
猜你喜欢
  • 2018-12-27
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 2015-01-11
  • 2014-12-17
  • 1970-01-01
  • 2010-12-23
相关资源
最近更新 更多