我正在尝试定义一个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 scope
,error: 'va_end' was not declared in this scope
。
如何解决这个问题?
答案 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我,我会尝试更新我的答案:)