71

我有一堆编译时断言,例如:

CASSERT(isTrue) or CASSERT2(isTrue, prefix_)

使用 GCC 编译时,我收到很多警告,例如'prefix_LineNumber' defined but not used. 有没有办法可以隐藏编译时断言的警告?我没有运气搜索 GCC 文档。我想我可能会在同一个宏中自动全局使用 var,但我想不出任何方法来做到这一点。

有谁知道在 GCC 中隐藏该警告的方法?

4

8 回答 8

110

刚刚在寻找这个问题的解决方案时看到了这个帖子。为了完整起见,我在这里发布了我找到的解决方案...

控制未使用警告的 GCC 编译器标志包括:

-Wunused-function
-Wunused-label
-Wunused-parameter
-Wunused-value
-Wunused-variable
-Wunused (=all of the above)

其中每一个都有一个相应的否定形式,在 W 之后插入“no-”,这会关闭警告(例如,如果它是由 -Wall 打开的)。因此,在您的情况下,您应该使用

-Wno-unused-function

当然,这适用于整个代码,而不仅仅是编译时断言。对于特定于函数的行为,请查看Function attributes

于 2009-03-04T11:17:56.037 回答
54

GCC不与其他编译器冲突的解决方法

#ifdef __GNUC__
#define VARIABLE_IS_NOT_USED __attribute__ ((unused))
#else
#define VARIABLE_IS_NOT_USED
#endif

int VARIABLE_IS_NOT_USED your_variable;
于 2008-12-22T13:45:32.040 回答
43

这是最烦人的警告之一,尽管我不明白检查死代码可能有用(有时)。但是我通常有用于调试的静态函数,或者将来某个时候可能有用的函数,或者只是临时使用的函数,我想将它们保留在代码中。

幸运的是,这个警告并不关心内联函数。

inline static foo()
{
}
于 2011-05-12T22:09:46.187 回答
34

您可以创建一个空语句并将结果强制转换为 void。这可以跨编译器移植,gcc 不会给你任何警告,即使启用-Wall-Wextra启用。例如:

int var;    // var is not used
(void)var;  // null statement, cast to void -- suppresses warning

一种常见的技术是为此创建一个宏:

#define UNUSED(x) ((void)(x))

int var;
UNUSED(var);
于 2008-12-27T02:12:44.573 回答
10
#define UNUSED_VAR     __attribute__ ((unused))

对于任何变量,只需在其类型之前使用上述宏,例如:

UNUSED_VAR int a = 2;
于 2015-03-05T14:37:05.637 回答
4

用以下指令包装这个函数所有放在 push 和 pop 之间的代码都不会警告你未使用的函数。所有其余的代码(除了 push 和 pop)都不会受到影响。

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"

... your code

#pragma GCC diagnostic pop
于 2018-12-10T16:47:50.227 回答
3

如果不知道静态断言宏的详细信息,这很难回答。也许您可以更改为不同的宏来避免这个问题?您可以按照建议将“未使用”属性添加到宏中,也可以使用不同形式的 CASSERT()。

以下是一些替代方案的描述:

http://www.jaggersoft.com/pubs/CVu11_3.html

http://blog.kowalczyk.info/kb/compile-time-asserts-in-c.html

http://www.pixelbeat.org/programming/gcc/static_assert.html

于 2008-12-27T01:33:39.970 回答
2

怎么样-Wunused-label

于 2008-12-22T13:15:31.353 回答