我有一堆编译时Assert,例如:
CASSERT(isTrue) or CASSERT2(isTrue, prefix_)
当我用GCC编译的时候,我收到了很多警告,比如'prefix_LineNumber' defined but not used。有没有办法隐藏编译时Assert的警告?我在GCC文档中找不到答案。我想我可能会在同一个宏中自动全局使用var,但是我想不出任何办法。有人知道在GCC中隐藏该警告的方法吗?
'prefix_LineNumber' defined but not used
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属性。
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;
nom7f22z3#
这是最烦人的警告之一,尽管我知道检查死代码可能有用(有时),但我通常有静态函数用于调试,或者将来某个时候可能有用的函数,或者只是暂时使用的函数,我想把它们保留在代码中。幸运的是,这个警告并不关心内联函数。
inline static foo() { }
jjhzyzn04#
您可以创建一个null语句并将结果强制转换为void。这可以跨编译器移植,并且gcc不会给予您任何警告,即使启用了-Wall和-Wextra。例如:
-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);
uidvcgyl5#
#define UNUSED_VAR __attribute__ ((unused))
对于任何变量,只需在其类型之前使用上述宏,例如:
UNUSED_VAR int a = 2;
72qzrwbm6#
用以下指令 Package 此函数所有放在push和pop之间的代码都不会警告您未使用的函数。所有其他代码(push和pop之外的)都不会受到影响。
#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-function" ... your code #pragma GCC diagnostic pop
sg3maiej7#
如果不知道静态Assert宏的详细信息,这个问题很难回答。也许您可以更改为其他宏来避免这个问题?您可以按照建议在宏中添加'unused'属性,或者使用其他形式的CASSERT()。以下是一些替代方案的说明:http://www.jaggersoft.com/pubs/CVu11_3.htmlhttp://blog.kowalczyk.info/kb/compile-time-asserts-in-c.htmlhttp://www.pixelbeat.org/programming/gcc/static_assert.html
b4lqfgs48#
-Wunused-label怎么样?
-Wunused-label
pgpifvop9#
从C++ 17开始,您可以使用[maybe_unused](https://en.cppreference.com/w/cpp/language/attributes/maybe_unused)。例如,
[[maybe_unused]] int foo = 42;
其具有与旧的(Er)__attribute__((unused))相同的效果。
__attribute__((unused))
9条答案
按热度按时间o0lyfsai1#
刚刚看到这个线程,而寻找解决这个问题。我在这里张贴完整的解决方案,我发现...
控制未使用的warnings的GCC编译器标志包括:
每一个都有一个对应的否定形式,在W后面插入“no-”,它关闭警告(例如,如果它是由-Wall打开的)。
当然,这对整个代码都有效,而不仅仅是编译时Assert。对于函数特有的行为,请查看Function属性。
sy5wg1nm2#
GCC解决方案不会导致与其他编译器冲突
nom7f22z3#
这是最烦人的警告之一,尽管我知道检查死代码可能有用(有时),但我通常有静态函数用于调试,或者将来某个时候可能有用的函数,或者只是暂时使用的函数,我想把它们保留在代码中。
幸运的是,这个警告并不关心内联函数。
jjhzyzn04#
您可以创建一个null语句并将结果强制转换为void。这可以跨编译器移植,并且gcc不会给予您任何警告,即使启用了
-Wall
和-Wextra
。例如:一种常用的方法是为此创建宏:
uidvcgyl5#
对于任何变量,只需在其类型之前使用上述宏,例如:
72qzrwbm6#
用以下指令 Package 此函数所有放在push和pop之间的代码都不会警告您未使用的函数。所有其他代码(push和pop之外的)都不会受到影响。
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
b4lqfgs48#
-Wunused-label
怎么样?pgpifvop9#
从C++ 17开始,您可以使用[maybe_unused](https://en.cppreference.com/w/cpp/language/attributes/maybe_unused)。例如,
其具有与旧的(Er)
__attribute__((unused))
相同的效果。