1

我定义了一个 PRINTF 宏,如下所示:

#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

如何更改非日志记录宏以不发出警告?

笔记:

  1. 我不想添加编译标志-Wunused-value
  2. 我不想使用可变参数 MACRO。
  3. 禁用 printf 时,应删除所有代码以避免影响系统性能。
4

4 回答 4

1

您可以使用 gcc 的诊断编译指示。这个

于 2012-12-22T07:39:26.063 回答
1

解决方案很简单:不要使用宏。

#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

您还可以使用“格式”__attribute__ 指示 GCC 对格式字符串进行类型检查(参见http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)。

于 2012-12-22T08:24:59.463 回答
0

我知道这篇文章真的很老了,但试试这个:

#if(PRINTF_VERSION & PRINTF_DISABLE)
  #define CYPRINTF    (void)
#else
  #define CYPRINTF    printf
#endif

void 强制转换应该告诉编译器该语句没有价值。我没有测试过它,但过去曾尝试过类似的东西。应该管用。

于 2013-10-24T06:38:26.340 回答
0

只是为了添加另一个选项,我今天使用过。@Fëamarto 的回答很好,但对我不起作用,因为我使用复杂的打印和打印宏的多级包装。

但是 lambdas 有魔力:

#if(PRINTF_VERSION & PRINTF_DISABLE)
    #define CYPRINTF [](){return 0;}()
#else
    #define CYPRINTF    printf
#endif
于 2019-02-12T14:36:20.430 回答