【问题标题】:Defining a NOOP macro without getting unused variables error定义 NOOP 宏而不出现未使用的变量错误
【发布时间】:2015-04-02 23:40:33
【问题描述】:

我正在尝试定义一个 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

如何解决这个问题?

【问题讨论】:

  • TRACE 应该做什么?它应该抑制未使用的警告吗?
  • 它应该只是转换为 NOOP。这样的程序可能毫无意义,但我在更大的代码库中面临完全相同的情况。有很多 TRACE 宏。现在我不想去评论他们每个人。所以我想把那个宏改成 NOOP
  • 查看C #define macro for debug printing 以获取有关密切相关主题的大量信息。实际上,我认为它应该涵盖您想要的内容。你得到了哪些错误?未使用的变量或未声明的宏(va_startva_end),还是两者兼而有之?您可以通过使用它们来避免未使用的变量;请参阅调试打印宏问题。目前尚不清楚va_start()va_end() 的使用位置,但它们在<stdarg.h> 中定义,包括在内应该可以解决错误。
  • 你考虑过使用assert宏吗?
  • 您需要显示重现 va_start/va_end 问题所需的最少代码。显示的代码不是那个代码——至少在我可以访问的任何机器上。 (请参阅如何创建 MCVE (Minimal, Complete, Verifiable Example) 或 SSCCE (Short, Self-Contained, Correct Example) - 两个名称和链接用于相同的想法)。您显示的内容可能会产生未使用的变量警告/错误,但不会产生 va_start/va_end 问题。

标签: c


【解决方案1】:

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

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

该功能是assertassert 的妙处(除了它引入了可能有助于维护的内部文档)是,当您将程序编译为发布版本时,它们将从您的机器代码中消失。

Section 7.2 of the C standard 记录了 assert() 宏扩展为 ((void)0),您似乎认为这会导致错误。 Which errors?您在示例中定义的 TRACE 和我定义为看起来像 FUBARTRACE 在 C 中完全有效。

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

强调一下,上面的代码可以按照您的预期编译和运行!毕竟FUBAR是需要assert来实现的。如果由于某种原因上面的代码不起作用,我在 cmets 中暗示了另一种选择:

#include <assert.h>
#define TRACE(A,...) assert(A || 1)

您看到的这两个va_startva_end 错误是由我们在此问题中看不到的其他原因引起的。如果我不得不冒险猜测,我建议您忘记#include &lt;stdarg.h&gt;。抱歉,在您发布 MCVE 之前,我无法帮助您解决这两个错误。我通常会等待这样的 MCVE,但似乎您在 6 个多月前收到提示,但尚未回复...如果您这样做,请联系我,我会尝试更新我的答案 :)

【讨论】:

  • 当断言被禁用时,这将如何避免未使用变量的警告? C++ 解决方案/C++ 代码如何帮助标记为“C”的问题?
  • @Jens 关于警告,我敢肯定,正如您所见,还有更多代码没有显示 OP 的代码......抱歉,先生。我们不可能都是完美的……我想如果你看看我的个人资料,你会发现我应该知道得更多(我 89% 的声誉来自 C 标签)。不幸的是,我犯了一个错误,在问题中看到了“C++”,所以我认为这是一个 C++ 问题。正如我所说,我们不可能都是完美的。
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
相关资源
最近更新 更多