gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:37:41 24 4
gpt4 key购买 nike

我正在尝试定义一个 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 ' 未在此范围内声明

如何解决这个问题?

最佳答案

您似乎在没有意识到的情况下无意中发布了您自己问题的答案。

请允许我描述一个您可能不知道的 C 语言的切线特性。当您调试软件时,这是一个最有用的功能;它可以让你 assert条件为真,并且将在运行时检查该条件(当您运行调试构建时)。

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

Section 7.2 of the C standard记录 assert()宏扩展为 ((void)0) ,您似乎已经得出结论会导致错误。 Which errorsTRACE您已经在示例中定义了 TRACE我会定义看起来像 FUBAR在 C 中完全有效。

#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_startva_end您看到的错误是由我们在此问题中看不到的其他原因引起的。如果我不得不冒险猜测,我建议你忘记了 #include <stdarg.h> .抱歉,在您发布 MCVE 之前,我无法帮助您解决这两个错误。我通常会等待这样的 MCVE,但似乎你在六个月前就被提示要一个,但还没有回应......如果你这样做,请 ping 我,我会尝试更新我的答案:)

关于c - 定义 NOOP 宏而不会出现未使用的变量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29424242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com