首页 > 解决方案 > 在错误/警告输出中禁用某些宏的扩展

问题描述

我有一个非常常用的、有些复杂的宏(MAC(...)为了这个问题,我们称之为),它必须是一个宏(因为它是非常通用的)。该宏在语法上的行为类似于函数调用,但在内部调用了 10 多个其他宏。

因此,如果我在调用时出错,MAC()例如,如果我这样做: MAC(1-)gcc/clang 将向我转储相当长的预处理器堆栈跟踪MAC(),我对此完全不感兴趣。

如果我这样定义 MAC() :

#if DEBUG_MAC
    int MAC(); //so I get a nice preprocessor stack trace
#else
    #define MAC(...) //here would come the actual definition
#endif

然后,在遇到我重新编译的错误时-DDEBUG_MAC,我得到了一个很好的(=不存在的)预处理器堆栈跟踪,但这种方法感觉很笨拙,只适用于诊断硬错误,而不是警告。

有没有办法让 gcc 或 clang 表现得像这样,即,为了错误报告的目的,将宏视为不透明的函数调用,而不进行这种声明/宏改组?

标签: cgccclangc-preprocessor

解决方案


推荐阅读