将语句表达式标记为未使用

时间:2015-11-25 20:13:15

标签: c gcc clang

如何标记statement expression,即

({struct Value * t = expr; set(t,val); t;})

可能未使用,即

__attribute__((unused))

它自动生成的代码,带有副作用。推断结果是否未被使用,并且在(void)0代替t生成时间会显着增加复杂性。最好的解决方案是将其标记为未使用,否则我必须-Wno-unused-value

2 个答案:

答案 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);