C++ 如何使预处理器在宏展开结果中插入换行符?
使用C/C++宏,很容易自动生成长结构。例如,如果我希望一组庞大的方法永远不会抛出异常(COM公开方法必须这样做),我可以这样做:C++ 如何使预处理器在宏展开结果中插入换行符?,c++,macros,c-preprocessor,C++,Macros,C Preprocessor,使用C/C++宏,很容易自动生成长结构。例如,如果我希望一组庞大的方法永远不会抛出异常(COM公开方法必须这样做),我可以这样做: #define BEGIN_COM_METHOD\ try{ #define END_COM_METHOD\ return S_OK;\ } catch( exception& ) {\ // set IErrorInfo here\ return E_FAIL;\ } 要使这些宏易于管理,
#define BEGIN_COM_METHOD\
try{
#define END_COM_METHOD\
return S_OK;\
} catch( exception& ) {\
// set IErrorInfo here\
return E_FAIL;\
}
要使这些宏易于管理,可以使用“\”字符使宏定义多行且更可读
问题是,有时带有此类结构的代码将无法编译—某些内容不会按预期进行扩展,并且编译器会收到无效代码。编译器通常有“生成预处理文件”选项来向开发人员显示预处理结果。但在预处理的文件中,宏被展开成一行,结果几乎不可读
是否可以使预处理器在宏定义中保留换行符?您不能这样做。替换文本一直到行尾,即
#define
d,因此不会有换行符。如果您很少遇到编译问题,您可以在编译之前通过缩进或类似的方式运行预处理文件,以帮助您获得更可读的代码。这是不可能的,因为在涉及预处理器之前的第2阶段,删除了\
字符。有关翻译阶段的列表,请参见问题。您发现了一种不应使用宏的情况。模糊的控制流在这里尤其令人讨厌。@nobugz是的,但我们目前有1600个COM暴露方法,我们需要在每个方法中进行尝试捕获和参数跟踪,这些提示必须是可维护的。C++没有其他方法来使用宏来进行这一点。非常好的艺术作品,谢谢。