如何标记statement expression,即
({struct Value * t = expr; set(t,val); t;})
可能未使用,即
__attribute__((unused))
它自动生成的代码,带有副作用。推断结果是否未被使用,并且在(void)0
代替t
生成时间会显着增加复杂性。最好的解决方案是将其标记为未使用,否则我必须-Wno-unused-value
。
答案 0 :(得分:1)
是的,如果您在宏或类似物中使用此类内容,这可能会非常令人不安。我通常在最后使用完全没用的任务来沉默这些警告:
t = t;
这有两个影响:编译器现在认为使用了t
,并且结果是rvalue,所以没有人可以尝试获取整个({ })
表达式的地址。 / p>
答案 1 :(得分:1)
以下是我使用的内容:
// tell compiler to shut up about unused variables
#define VARIABLE_USED(_sym) \
_variable_used(!!_sym)
__attribute__((__always_inline__)) static inline
void
_variable_used(int flg)
{
}
!!
技巧,上述几乎适用于任何内在类型(包括指针)inline
而不是static inline
__attribute__((__always_inline__))
因此,代码中的某处只为所有未使用的符号添加VARIABLE_USED(my_unused_variable);
。
注意:这是零开销(即不产生额外代码)。看起来它可能与参数的制定有关,但由于内联定义,它会被优化掉。但是,它确实欺骗编译器认为变量已被使用。
以上是我长期使用的内容。但是,我只是想到了一个可能更简单的变体[这是未经测试的]:
// tell compiler to shut up about unused variables
#define VARIABLE_USED(_sym) \
do { \
if (1) \
break;
if (!! _sym) \
break; \
} while (0)
这些宏可能适用于结构体,如下所示:
struct foobar foo;
...
VARIABLE_USED(&foo);