【问题标题】:How can I make the preprocessor insert linebreaks into the macro expansion result? [duplicate]如何使预处理器在宏扩展结果中插入换行符? [复制]
【发布时间】:2026-02-15 18:15:02
【问题描述】:

使用 C/C++ 宏很容易自动生成长结构。例如,如果我希望大量方法永远不会抛出异常(COM 公开方法必须这样做),我可以这样做:

#define BEGIN_COM_METHOD\
    try{

#define END_COM_METHOD\
    return S_OK;\
    } catch( exception& ) {\
        // set IErrorInfo here\
        return E_FAIL;\
    }

为了使此类宏易于管理,可以使用“\”字符使宏定义多行且更具可读性。

问题是有时具有此类结构的代码无法编译 - 某些内容不会按预期扩展,并且编译器会出现无效代码。编译器通常具有“生成预处理文件”选项来向开发人员显示预处理结果。但是在预处理的文件中,宏被展开为一行,结果几乎无法阅读。

是否可以让预处理器在宏定义中保留换行符?

【问题讨论】:

  • 您发现了一种永远不应该使用宏的情况。模糊的控制流在这里特别讨厌。
  • @nobugz 是的,但是我们目前有 1600 个 COM 公开方法,我们需要在每个方法中进行 try-catch 和参数跟踪,并且这些花里胡哨的东西必须是可维护的。除了使用宏,C++ 没有其他方法可以做到这一点。

标签: c++ macros c-preprocessor


【解决方案1】:

你做不到。替换文本直到 #defined 所在行的末尾,因此其中不会有换行符。如果您的编译问题不常见,您可以在编译之前通过indent 或类似的方式运行预处理文件,以帮助您获得更具可读性的代码。

【讨论】:

    【解决方案2】:

    这是不可能的,因为\ 字符在阶段 2 中被删除,涉及预处理器之前。有关翻译阶段的列表,请参阅问题Poster with the 8 phases of translation in the C language

    【讨论】:

    • 伟大的艺术品,谢谢。