2010-01-22 81 views
7

使用C/C++宏可以很容易地自动生成长结构。例如,如果我想要一个巨大的一套方法不曾经抛出异常(必须为COM暴露的方法),我可以做这样的事情:如何使预处理器插入换行符进入宏扩展结果?

#define BEGIN_COM_METHOD\ 
    try{ 

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

做出这样的宏管理可以使用“\”字符使宏定义成为多行并且更具可读性。

问题是,有时这些构造的代码不会编译 - 某些东西不会像预期的那样扩展,并且编译器会出现无效的代码。编译器通常具有“生成预处理文件”选项以向开发人员显示预处理结果。但是在预处理文件中,宏被扩展为一行,结果几乎不可读。

是否有可能使预处理器保持宏定义中的换行符?

+1

你已经发现了一个宏不应该被使用的情况之一。混淆的控制流程在这里特别讨厌。 – 2010-01-22 13:05:31

+2

@nobugz是的,但我们目前有16个COM暴露方法,我们需要在每个方法中尝试捕获和参数跟踪,并且这些花哨和哨声必须可维护。 C++没有提供其他方式来使用宏进行这种扩展。 – sharptooth 2010-01-25 15:43:23

回答

6

你不能这样做。替换文本直到它的结尾为#define d,所以它不会有换行符。如果您的编译问题不频繁,您可以在编译之前通过indent或类似的东西运行预处理的文件,以便恰好帮助您获得更易读的代码。