【发布时间】: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