【问题标题】:What is the best way to suppress A "Unused variable x" warning? [duplicate]抑制“未使用的变量 x”警告的最佳方法是什么? [复制]
【发布时间】:2011-03-25 23:22:57
【问题描述】:

抑制编译器(在本例中为 GCC)如“未使用的变量 x”警告的最佳/最简洁的方法是什么?

我不想给 GCC 提供任何特定的标志来删除所有这些警告,只是为了特殊情况。

【问题讨论】:

  • 有正当理由这样做,例如为系统进行插件开发,该系统期望您的函数具有特定签名,例如 void function_name(int par1, char *par2);,您只需要在 par2 上工作。
  • 在这种情况下,将签名写为void function_name(int par1, char*);,这是完全有效的,不会产生警告。
  • @spaceknarf 如果我使用 gcc 4.7.2 这样做,我会得到 error: parameter name omitted
  • 我认为在 C 函数签名中保留未命名的参数是无效的,因为它是定义的一部分。不过,这在 C++ 中是可以接受的。
  • 这不是重复的,这是一个不同的问题。其他问题询问有什么方法可以抑制警告,这个问题询问我们应该使用哪种方式。

标签: c gcc


【解决方案1】:

(void) variable 可能适用于某些编译器。

对于 C++ 代码,另请参阅 Mailbag: Shutting up compiler warnings Herb Sutter 建议使用的地方:

template<class T> void ignore( const T& ) { }

...

ignore(variable);

【讨论】:

  • 这适用于带有-std=c99的gcc 4.7.1
  • 它也适用于 VS。
  • (void) 不适用于启用了 gcc 4.9.2 和 C++11 的 nvcc 7.5。与template&lt;class T&gt; void ignore( const T&amp; ) { } 的herbsutter 链接效果很好!
  • 原始问题被标记为 C,而不是 C++。据我所知,(void)var 适用于所有主要的 C 编译器。
  • (void) variable 很酷,因为它适用于任何未使用的变量,而不仅仅是接受答案的函数参数。
【解决方案2】:

不要给变量命名(C++)

void foo(int /*bar*/) {
    ...
}

使用编译器特定的非标准机制告诉你的编译器

查看__attribute__((unused))、各种#pragmas 等的个人答案。可选地,围绕它包装一个预处理器宏以实现可移植性。

关闭警告

IDE 可以直观地指示未使用的变量(不同的颜色或下划线)。有了这个,编译器警告可能就没什么用了。

在 GCC 和 Clang 中,在命令行末尾添加 -Wno-unused-parameter 选项(在所有打开未使用参数警告的选项之后,如 -Wall-Wextra)。

添加强制转换为 void

void foo(int bar) {
    (void)bar;
}

根据jamesdlin's answerMailbag: Shutting up compiler warnings

【讨论】:

  • 我不敢相信评论它有效。如果您使用的是 C++ 并且它是兼容的,那么这就是要走的路。
【解决方案3】:

我发现一篇文章,http://sourcefrog.net/weblog/software/languages/C/unused.html,解释了 UNUSED。有意思的是作者还把没用的变量名弄乱了,以后不能不小心使用了。

摘录:

#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#else
# define UNUSED(x) x
#endif

void dcc_mon_siginfo_handler(int UNUSED(whatsig))

【讨论】:

  • ...另一个只写标题宏正是我们需要得到一个相当温和的警告的方式。
  • 我和你在一起。我的代码包含static const char cvsid[] = "$Id$";。那是简短、甜蜜和易读的,但 gcc -Wall 在它上面抛出了一个不稳定的问题。我不想为了抑制这个错误而编写所有这些难以理解的代码。
  • 链接已损坏:“错误:未找到。在此服务器上未找到请求的 URL /weblog/software/languages/C/unused.html。”
  • Re "UNUSED":你不是说unused(GCC的东西)吗?
  • 无论如何,你能链接到文档吗? (但没有“编辑:”、“更新:”或类似的 - 答案应该看起来好像是今天写的。)
【解决方案4】:

如果这确实是您想要的,您可以使用 unused 属性(仅限 GCC),例如:

void foo(int __attribute__((__unused__)) bar) {
    ...
}

当然,不仅仅是函数参数,这是最常见的用例,因为它可能是 API 的回调函数,您实际上并不需要所有输入。

此外,GLib 有一个 G_GNUC_UNUSED 宏,我相信它会扩展为该属性。

【讨论】:

    【解决方案5】:

    您可以使用 #pragma 使警告静音

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wunused"
    
    int unususedVariable = 1;
    
    #pragma clang diagnostic pop
    

    如果您使用的是 GCC,请使用 #pragma gcc ...

    【讨论】:

    • 也许最后一行应该是#pragma clang diagnostic pop
    • #pragma GCC ...(它需要大写 GCC)
    【解决方案6】:

    #pragma unused &lt;variable&gt;

    【讨论】:

    • 不可移植 - 在许多编译器上生成“未知编译指示”警告
    • Paul:这是真实有效的,但我假设它不需要是可移植的,因为我能想到有未使用的变量的唯一原因是因为你有一些代码被注释掉了调试并且您仍然希望您的(临时)调试版本只显示您不期望的警告。
    • 在 Xcode4.0 和 LLVM 3.0/GCC 4.2 中使用它需要你使用括号。 #pragma unused (variable)
    【解决方案7】:

    强制转换为 void 是最好的方法,因为它表明您没有“意外”将变量保留在代码中 - 即:此函数可能是一个实例,其中您有一个需要相同的函数指针表参数类型和返回类型,但在这个特定的表条目中您没有使用参数。

    也就是说,如果您不需要它,请摆脱它。 ;)

    【讨论】:

    • 您能否添加一个示例(实际编译(使用一个或多个特定编译器的某些特定版本))? (但没有“编辑:”、“更新:”或类似的 - 答案应该看起来好像是今天写的。)
    【解决方案8】:

    这是一个非常老套的解决方案,但请尝试简单地将变量分配给它自己。

    我认为这应该让大多数编译器误以为使用了该变量。它也应该很便携。

    【讨论】:

    • 它确实使编译器误以为它已被使用,但您可能会收到“代码无效”警告,具体取决于编译器和选项。
    • = 运算符可能因副作用而过载。你永远都不会知道。 cast to void 似乎更好。例如(void)my_unused_thing;
    • Clang(可能还有 GCC)现在有一个警告,让我们现在可以准确地捕捉到这一点,顺便说一句。
    【解决方案9】:

    将其分配给自己:

    void f(int unused) {
        unused = unused;
    }
    

    它在 GCC 中工作,但 Clang 需要 -Wno-self-assign


    我认为强制转换为 void 是最便携的解决方案:GCC 和 Clang 都理解这一点,即使有完整的警告 -W{all,extra,pedantic}

    (void)unused;
    

    【讨论】:

      【解决方案10】:

      从代码中删除未使用的变量声明(双关语)。

      (什么???这就是我所做的:指出显而易见的最有可能是最好的解决方案。)

      现在,从 cmets 的其他答案来看,显然它是由宏产生的垃圾。嗯,这是一个pleonasm。

      解决方案:

      • 将该宏重构为 #if 仅在变量真正被使用时才声明它;
      • 创建另一个版本的宏以跳过未使用的变量生成。
      • 最好还是避免使用会给代码带来问题的宏。

      【讨论】:

      • 在这种情况下不可能。这是一个“吐出”变量的宏,我不想在这种情况下使用它。
      • 还有其他情况 - 例如,如果您需要向外部 API 提供回调函数,但您并不真正使用/关心某些参数,您会收到警告
      • nos:谢谢你不要认为我像上面的许多 cmets 一样完全愚蠢。
      • 写出更精准的问题,你会得到更精准的答案
      • -1,答案没有实质内容。甚至没有试图理解真正的问题。不,好评,+1
      【解决方案11】:

      如果它已被使用并且您正在交付项目,请将其删除。最糟糕的是,评论它。

      【讨论】:

      • 我有这些警告,因为变量是通过 ASM 分配的,所以它们没有被使用但我的编译器不知道...
      猜你喜欢
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多