C语言中用属性警告未使用的结果,c-抑制“未使用的变量x”警告的最佳方法是什么...

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

这个问题已经在这里有了答案:

如何在C语言中禁止“未使用的参数”警告?                                     11个答案

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

我不想给gcc某些标志以删除所有这些警告,仅在特殊情况下。

gustaf asked 2020-01-15T09:02:06Z

11个解决方案

43 votes

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

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

template void ignore( const T& ) { }

...

ignore(variable);

jamesdlin answered 2020-01-15T09:02:55Z

24 votes

不要给变量起名字(C ++)

void foo(int /*bar*/) {

...

}

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

请参见有关2703502242187057052032,各种2703502242187052020s等的答案。 (可选)将preprocesor宏包装在其周围,以实现可移植性。

关闭警告

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

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

将演员表添加到虚空

void foo(int bar) {

(void)bar;

}

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

user7610 answered 2020-01-15T09:03:47Z

22 votes

找到了一篇说明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))

Edward Leno answered 2020-01-15T09:02:31Z

13 votes

如果这确实是您想要的,则可以使用未使用的属性(仅gcc),例如:

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

...

}

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

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

Cascabel answered 2020-01-15T09:04:16Z

12 votes

您可以使用#pragma gcc ...消除警告

#pragma clang diagnostic push

#pragma clang diagnostic ignored "-Wunused"

int unususedVariable = 1;

#pragma clang diagnostic pop

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

James Webster answered 2020-01-15T09:04:40Z

3 votes

#pragma unused

nmichaels answered 2020-01-15T09:05:00Z

2 votes

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

Mhmmd answered 2020-01-15T09:05:20Z

1 votes

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

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

Mike Stroven answered 2020-01-15T09:05:45Z

0 votes

将其分配给自己。

void f(int unused) {

unused = unused;

}

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

编辑:我现在认为强制转换为空是最可移植的解决方案:即使有完整的警告-W{all,extra,pedantic},gcc和clang也都可以理解:

(void)unused;

user2394284 answered 2020-01-15T09:06:14Z

-9 votes

如果使用了它并且您正在运送项目,请删除它。 最糟糕的评论。

Praveen S answered 2020-01-15T09:06:34Z

-9 votes

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

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

现在,从对其他答案的评论来看,显然这是从宏生成的垃圾。 好吧,这是一个多方面的问题。

解决方案:

仅在确实使用该变量时才将其重构为#if声明该变量;

创建另一个版本的宏,以跳过未使用的变量生成。

更好的是,避免使用将问题引入代码的宏。

jpinto3912 answered 2020-01-15T09:07:21Z

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值