有许多不同的技术可以禁用未使用的变量警告。一些有空,与属性相同。他们都假设你知道它是一个变量。
我有一个宏的例子,它改变了发布和调试的行为,比如说:
#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
答案 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)
总是错误的条件