有没有办法让 gcc 禁用特定警告
Posted
技术标签:
【中文标题】有没有办法让 gcc 禁用特定警告【英文标题】:Is there a way for gcc to disable specific warning 【发布时间】:2012-12-22 07:36:49 【问题描述】:我定义了一个 PRINTF MACRO 如下所示:
#if(PRINTF_VERSION & PRINTF_DISABLE)
#define CYPRINTF
#else
#define CYPRINTF printf
#endif
但是当打印被禁用时,我收到以下警告:
warning: statement with no effect
我尝试了以下解决方案,它适用于 GCC 编译器,但不能适用于不支持可变参数 MACRO 的编译器。
#if(PRINTF_VERSION & PRINTF_DISABLE)
#define CYPRINTF(format, ...)
#else
#define CYPRINTF printf
#endif
如何更改非日志记录宏以不发出警告?
注意事项:
-
我不想添加编译标志
-Wunused-value
。
我不想使用可变参数 MACRO。
当 printf 被禁用时,应删除所有代码以避免影响系统性能。
【问题讨论】:
由于 GCC 支持可变参数宏,您可以轻松避免使用 GCC 的警告。哪个其他编译器会产生您担心的警告——也就是说,哪个其他编译器不支持可变参数宏? (我可以猜到,但你应该说明是哪个。) 【参考方案1】:你可以使用gcc的diagnostic pragmas.和this
【讨论】:
【参考方案2】:解决方法很简单:不要使用宏。
#if(PRINTF_VERSION & PRINTF_DISABLE)
int CYPRINTF(const char*, ...)
return 0;
#else
#include <cstdarg>
int CYPRINTF(const char* format, ...)
va_list args;
va_start(args, format);
int ret = vprintf(format, args);
va_end(args);
return ret;
#endif
您还可以指示 GCC 使用“格式”__attribute__ 对格式字符串进行类型检查(请参阅http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)。
【讨论】:
但是,这会影响系统性能,尤其是嵌入式系统。 你确定会影响性能吗?您可能会对 GCC 的优化能力感到惊讶。 @Vincent I/O 很慢。即使函数没有被内联,与使用 (v)printf() 进行 I/O 相比,函数调用的成本也不算什么。在选择空函数的情况下,编译器根本不会生成函数调用,因为在这种情况下它可以很容易地推断出该函数什么都不做。而且我非常怀疑你是否在一个紧密的循环中调用 CYPRINTF。你呢? 感谢回复,但是我的应用是针对消费类应用的,我的MCU只有8KB flash和1KB RAM;所以我不希望在发布版本@Nikos C 中有任何未使用的代码。而且我不希望依赖于编译器优化。【参考方案3】:我知道这篇文章很老了,但试试这个:
#if(PRINTF_VERSION & PRINTF_DISABLE)
#define CYPRINTF (void)
#else
#define CYPRINTF printf
#endif
void 强制转换应该告诉编译器该语句没有价值。我没有测试过它,但过去曾尝试过类似的东西。应该可以。
【讨论】:
【参考方案4】:只是为了添加另一个选项,我今天使用过。 @Fëamarto 的回答很好,但对我不起作用,因为我使用复杂的打印和打印宏的多级包装。
但是 lambdas 有魔力:
#if(PRINTF_VERSION & PRINTF_DISABLE)
#define CYPRINTF []()return 0;()
#else
#define CYPRINTF printf
#endif
【讨论】:
以上是关于有没有办法让 gcc 禁用特定警告的主要内容,如果未能解决你的问题,请参考以下文章