抑制 C 警告“未使用的变量 x”的最佳方法? [重复]

问题描述 投票:0回答:11

抑制 C 编译器(例如 GCC)如“未使用变量 x”警告的最佳/最有效方法是什么?

GCC 的证明说明

-Wunused-变量
每当局部变量或非常量静态变量除声明外未使用时发出警告

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

c suppress-warnings
11个回答
52
投票

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

对于 C++ 代码,另请参阅Mailbag:关闭编译器警告 Herb Sutter 建议使用:

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

...

ignore(variable);

44
投票

不要给变量起名字

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

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

查看

__attribute__((unused))
、各种
#pragma
等的个别答案。可选地,将预处理器宏包裹在它周围以实现可移植性。

关闭警告

IDE 可以直观地标记未使用的变量(不同的颜色或下划线)。有了它,编译器警告可能就没用了。

在 GCC 和 Clang 中,在命令行末尾添加

-Wno-unused-parameter
选项(在所有打开未使用参数警告的选项之后,如
-Wall
-Wextra
)。

添加演员阵容到虚空

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

根据jamesdlin的回答Mailbag:关闭编译器警告.


25
投票

我找到一篇文章,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))

18
投票

如果这真的是你想要的,你可以使用 unused 属性(仅限 GCC),比如:

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

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

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


14
投票

您可以使用

#pragma

使警告静音
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused"

int unususedVariable = 1;

#pragma clang diagnostic pop

如果您使用的是 GCC,请使用

#pragma gcc ...


4
投票

#pragma unused <variable>


4
投票

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

也就是说,如果你不需要它,就把它扔掉。 ;)


4
投票

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

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


0
投票

分配给自己:

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

它在 GCC 中有效,但 Clang 需要 -Wno-self-assign.


我认为转换为 void 是最便携的解决方案:GCC 和 Clang 都理解这一点,即使有完整的警告

-W{all,extra,pedantic}

(void)unused;

-9
投票

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

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

现在,从对其他答案的评论来看,显然是宏生成的垃圾。嗯,这是一个 pleonasm.

解决方案:

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

-10
投票

如果它被使用并且你正在发布项目,请将其删除。最糟糕的是,评论它。

© www.soinside.com 2019 - 2024. All rights reserved.