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

时间:2008-12-22 13:02:30

标签: gcc warnings compiler-warnings

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

CASSERT(isTrue) or CASSERT2(isTrue, prefix_)

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

有没有人知道在GCC中隐藏警告的方法?

8 个答案:

答案 0 :(得分:93)

在搜索此问题的解决方案时,只看到了这个帖子。我在这里发布完整性我找到的解决方案......

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

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

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

-Wno-unused-function

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

答案 1 :(得分:46)

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

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

int VARIABLE_IS_NOT_USED your_variable;

答案 2 :(得分:32)

您可以创建一个null语句并将结果转换为void。这可以在编译器之间移植,即使启用了-Wall-Wextra,gcc也不会向您发出任何警告。例如:

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

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

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

int var;
UNUSED(var);

答案 3 :(得分:30)

这是最令人讨厌的警告之一,虽然我认为检查死代码可能有用(有时)。但是我通常有用于调试的静态函数,或者将来某个时候可能有用的函数,或者只是暂时使用的函数,我想将它们保存在代码中。

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

inline static foo()
{
}

答案 4 :(得分:6)

#define UNUSED_VAR     __attribute__ ((unused))

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

UNUSED_VAR int a = 2;

答案 5 :(得分: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

答案 6 :(得分:2)

-Wunused-label怎么样?

答案 7 :(得分:1)

通过以下指令包装此功能 将在push和pop之间放置的所有代码都不会警告您未使用的功能。 其余所有代码(push和pop之外)都不会受到影响。

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

... your code

#pragma GCC diagnostic pop