抑制“未使用的变量x” - 警告的最佳方法是什么

时间:2010-08-05 18:19:42

标签: c gcc

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

我不想给gcc提供任何特定的标志来删除所有这些警告,仅用于特殊情况。

11 个答案:

答案 0 :(得分:43)

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

对于C ++代码,另请参阅Herb Sutter建议使用的http://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler-warnings/

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

...

ignore(variable);

答案 1 :(得分:22)

找到一篇解释UNUSED的文章http://sourcefrog.net/weblog/software/languages/C/unused.html。有趣的是,作者还破坏了未使用的变量名称,因此您将来不会无意中使用它。

摘录:

#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)) 

答案 2 :(得分:22)

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

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

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

告诉编译器

查看__attribute__((unused)),各种#pragma等的个别答案。 (可选)在其周围包装一个预处理器宏以便于移植。

关闭警告

IDE可以直观地显示未使用的变量(不同的颜色或下划线)。有了这个,编译器警告可能会毫无用处。

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

添加一个转换为void

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

根据jamesdlin的回答和http://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler-warnings/

答案 3 :(得分:12)

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

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

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

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

答案 4 :(得分:11)

您可以使用#pragma

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

int unususedVariable = 1;

#pragma clang diagnostic pop

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

答案 5 :(得分:3)

#pragma unused <variable>

答案 6 :(得分:2)

这是一个非常讨厌的解决方案,但您是否尝试简单地将变量分配给自己?我认为这应该欺骗大多数编译器认为使用变量。应该也很便携。

答案 7 :(得分:0)

投射到虚空是最好的方法,因为它表明你没有意外地&#34;将变量保存在代码中 - 即:此函数可能是一个实例,其中有一个需要相同参数类型和返回类型的函数指针表,但在此特定表条目中,您没有使用该参数。

那就是说,如果你不需要它,摆脱它。 ;)

答案 8 :(得分:-1)

将其分配给自己。

import scrapy

class Funda1Spider(scrapy.Spider):
    name = "funda1"
    allowed_domains = ["funda.nl"]

    def __init__(self, place='amsterdam'):
        self.start_urls = ["http://www.funda.nl/koop/%s/" % place]

    def parse(self, response):
        filename = response.url.split("/")[-2] + '.html'
        with open(filename, 'wb') as f:
            f.write(response.body)

在gcc中工作,但是clang需要-Wno-self-assign。

编辑:我现在认为转换为无效是最便​​携的解决方案:gcc和clang都明白这一点,即使有完整的警告scrapy crawl funda1 -a place=rotterdam

rotterdam.html

答案 9 :(得分:-9)

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

(这就是我做的事情:指出显而易见的是最好的解决方案。)

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

解决方案:

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

答案 10 :(得分:-9)

如果已使用并且您要运送项目,请将其删除。最糟糕的评论。