如何让预处理器将换行符插入到宏扩展结果中?

时间:2010-01-22 09:08:35

标签: 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;\
    }

要使这些宏可管理,可以使用“\”字符使宏定义多行并且更易读。

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

是否可以使预处理器保持宏定义中存在换行符?

2 个答案:

答案 0 :(得分:6)

你不能这样做。替换文本一直到行的末尾#define d,因此它不会有换行符。如果您的编译问题很少,您可以在编译之前通过indent或类似的方式运行预处理文件,这样可以帮助您获得更易读的代码。

答案 1 :(得分:4)

这是不可能的,因为在第2阶段删除了\个字符,涉及预处理器之前。请参阅问题Poster with the 8 phases of translation in the C language以获取翻译阶段列表。