如何在GCC中隐藏“已定义但未使用”警告?

drkbr07n  于 2023-02-04  发布在  其他
关注(0)|答案(9)|浏览(166)

我有一堆编译时Assert,例如:

CASSERT(isTrue) or CASSERT2(isTrue, prefix_)

当我用GCC编译的时候,我收到了很多警告,比如'prefix_LineNumber' defined but not used。有没有办法隐藏编译时Assert的警告?我在GCC文档中找不到答案。我想我可能会在同一个宏中自动全局使用var,但是我想不出任何办法。
有人知道在GCC中隐藏该警告的方法吗?

o0lyfsai

o0lyfsai1#

刚刚看到这个线程,而寻找解决这个问题。我在这里张贴完整的解决方案,我发现...
控制未使用的warnings的GCC编译器标志包括:

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

每一个都有一个对应的否定形式,在W后面插入“no-”,它关闭警告(例如,如果它是由-Wall打开的)。

-Wno-unused-function

当然,这对整个代码都有效,而不仅仅是编译时Assert。对于函数特有的行为,请查看Function属性。

sy5wg1nm

sy5wg1nm2#

GCC解决方案不会导致与其他编译器冲突

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

int VARIABLE_IS_NOT_USED your_variable;
nom7f22z

nom7f22z3#

这是最烦人的警告之一,尽管我知道检查死代码可能有用(有时),但我通常有静态函数用于调试,或者将来某个时候可能有用的函数,或者只是暂时使用的函数,我想把它们保留在代码中。
幸运的是,这个警告并不关心内联函数。

inline static foo()
{
}
jjhzyzn0

jjhzyzn04#

您可以创建一个null语句并将结果强制转换为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);
uidvcgyl

uidvcgyl5#

#define UNUSED_VAR     __attribute__ ((unused))

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

UNUSED_VAR int a = 2;
72qzrwbm

72qzrwbm6#

用以下指令 Package 此函数所有放在push和pop之间的代码都不会警告您未使用的函数。所有其他代码(push和pop之外的)都不会受到影响。

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

... your code

#pragma GCC diagnostic pop
sg3maiej

sg3maiej7#

如果不知道静态Assert宏的详细信息,这个问题很难回答。也许您可以更改为其他宏来避免这个问题?您可以按照建议在宏中添加'unused'属性,或者使用其他形式的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

b4lqfgs4

b4lqfgs48#

-Wunused-label怎么样?

pgpifvop

pgpifvop9#

从C++ 17开始,您可以使用[maybe_unused](https://en.cppreference.com/w/cpp/language/attributes/maybe_unused)。例如,

[[maybe_unused]] int foo = 42;

其具有与旧的(Er)__attribute__((unused))相同的效果。

相关问题