定义NOOP宏而不会出现未使用的变量错误

时间:2015-04-02 23:40:33

标签: c

我正在尝试定义一个NOOP宏。我经历了How do I implement a no-op macro or template in C++。但是我收到unused variable错误。我无法改变gcc标志。所以我必须解决这个问题。你能帮忙吗?这是代码。

#define TRACE(...) 
int main() {
    int a = 10, b = 20;
    int c = 30;
    TRACE(a, b);
    TRACE(c);
} 

#define TRACE(...) (void)0给了我error: 'va_start' was not declared in this scopeerror: 'va_end' was not declared in this scope

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

你似乎无意中发现了你自己的问题的答案而没有意识到。

请允许我描述您可能不知道的C中的切向特征。当您调试软件时,它是最有用的功能;它允许assert条件为真,并且在运行期间(当您运行调试版本时)将检查该条件。

该功能为assert。关于assert(除了引入可能有助于维护的内部文档这一事实之外)的一个好处是,当您将程序编译为发布版本时,它们将从您的机器代码中消失。

Section 7.2 of the C standard文档表明assert()宏扩展为((void)0),您似乎已经得出结论会导致错误。 Which errors?您在示例中定义的TRACE和我定义为TRACE的{​​{1}}在C中都完全有效。

FUBAR

要强调的是,上面的代码按照您的预期进行编译和运行!毕竟,#define TRACE(...) #define FUBAR(...) ((void)0) int main() { int a = 10, b = 20; int c = 30; TRACE(a, b); FUBAR(c); } FUBAR需要实施的方式。还有另一种选择,我在评论中暗示,如果由于某种原因上述代码不起作用:

assert

您看到的这两个#include <assert.h> #define TRACE(A,...) assert(A || 1) va_start错误是由我们在此问题中看不到的其他错误引起的。如果我不得不冒险猜测,我建议您忘记va_end。对不起,在发布MCVE之前,我无法帮助您解决这两个错误。我通常会等待这样一个MCVE,但似乎六个月前你被提示一个并且还没有回复......如果你这样做,请ping我,我会尝试更新我的答案:)