使用C/C++宏可以很容易地自动生成长结构。例如,如果我想要一个巨大的一套方法不曾经抛出异常(必须为COM暴露的方法),我可以做这样的事情:如何使预处理器插入换行符进入宏扩展结果?
#define BEGIN_COM_METHOD\
try{
#define END_COM_METHOD\
return S_OK;\
} catch(exception&) {\
// set IErrorInfo here\
return E_FAIL;\
}
做出这样的宏管理可以使用“\”字符使宏定义成为多行并且更具可读性。
问题是,有时这些构造的代码不会编译 - 某些东西不会像预期的那样扩展,并且编译器会出现无效的代码。编译器通常具有“生成预处理文件”选项以向开发人员显示预处理结果。但是在预处理文件中,宏被扩展为一行,结果几乎不可读。
是否有可能使预处理器保持宏定义中的换行符?
你已经发现了一个宏不应该被使用的情况之一。混淆的控制流程在这里特别讨厌。 – 2010-01-22 13:05:31
@nobugz是的,但我们目前有16个COM暴露方法,我们需要在每个方法中尝试捕获和参数跟踪,并且这些花哨和哨声必须可维护。 C++没有提供其他方式来使用宏进行这种扩展。 – sharptooth 2010-01-25 15:43:23