Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使预处理器在宏展开结果中插入换行符?_C++_Macros_C Preprocessor - Fatal编程技术网

C++ 如何使预处理器在宏展开结果中插入换行符?

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;\ } 要使这些宏易于管理,

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

#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++没有其他方法来使用宏来进行这一点。非常好的艺术作品,谢谢。