当您不确定所拥有的变量是什么时,如何禁用未使用的变量警告

时间:2015-12-03 17:53:28

标签: c++ macros

有许多不同的技术可以禁用未使用的变量警告。一些有空,与属性相同。他们都假设你知道它是一个变量。

我有一个宏的例子,它改变了发布和调试的行为,比如说:

#if NDEBUG
#define MACRO(X)
#else
#define MACRO(X) do_something(X)
#endif

代码如:

void foo(int a) {
    MACRO(a);
}

可能会在发布时导致警告。我想将其更改为:

#if NDEBUG
#define MACRO(X) UNUSED(X)
#else
#define MACRO(X) do_something(X)
#endif

所以问题是我应该定义UNUSED,当任务因MACRO的参数不仅限于变量而复杂,但它也可以是函数调用或任何其他表达。或

MACRO(5);
MACRO(a+b);
MACRO(foo());

也是MACRO

的有效用途

2 个答案:

答案 0 :(得分:1)

以下是我喜欢的一个例子:

#ifdef NDEBUG
#define MACRO(X) ((void)sizeof((X), 0))
#else
#define MACRO(X) do_something((X))
#endif

您在宏参数中使用的名称最终被使用,但是在未评估的上下文中然后被转换为void,这会阻止不同的警告。

答案 1 :(得分:1)

你可能有:

#define UNUSED(X) (false && ((X),true))

然后使用逗号 - 运算符(出于打字原因)

或者

#define UNUSED(X) do{if (false) (void)(X);}while(0)

总是错误的条件