C语言 如何抑制特定的未使用但已设置变量的警告?

8aqjt8rx  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(116)

我有一些旧的代码,我试图在一个新的(er)编译器(armclang 6.18)上编译,我目前正在解决许多新的警告。一个我似乎不能通过的是一个变量,它被设置,但后来没有使用。

void IMT_hw_startup(void) {
    uint32_t encoder_value_0;
//[...]
    encoder_value_0 = encoder_values[0];
}

在这种情况下,对encoder_values的读访问具有硬件副作用,必须保持不变。
这段代码的结果是warning: variable 'encoder_value_0' set but not used [-Wunused-but-set-variable],我的主要问题是如何抑制这个特定变量的警告。我想在全球范围内保持这一警告。
在搜索这一点时,似乎有很多混淆和混淆之间的警告和unused-variable,无论如何,有一个属性,将抑制后者,但我找不到一个unused-but-set-variable
也是一个好奇心--没有上面的主要问题重要:“使用”的实际含义似乎不一致。根据上述警告,该变量为未使用;这似乎是明确的。
但是如果我添加未使用的属性:

uint32_t encoder_value_0 __attribute((unused));

然后我得到警告warning: 'encoder_value_0' was marked unused but was used [-Wused-but-marked-unused],其中变量被赋值(函数的最后一条语句)。我看不出有其他的解释-这与上述警告直接矛盾。要么赋值是“use”,要么不是。
无论如何,我如何单独地抑制这种情况下的警告,以便我可以在其他地方保持警告活动?
编辑:正如建议的那样,改变从encoder_values指针阅读的方法确实可以通过消除对变量的需要来解决这个问题:

if (encoder_values[0]) {}

我把这个问题留了下来,以防有更直接的答案。

klh5stk1

klh5stk11#

如果从encoder_values[0]中阅读有硬件副作用,那么它可能是用volatile声明的,在C中实现这些副作用的方法就是简单地计算encoder_values[0],不需要赋值:

encoder_values[0];

如果你确实因为某种原因赋值给encoder_value_0,并希望抑制编译器关于其值未被使用的警告,那么只需在一条语句中“使用”该值,告诉编译器你故意丢弃它:

(void) encoder_value_0;

请注意,如果encoder_values[0]没有用volatile声明,那么写入encoder_values_0 = encoder_values[0];并不能确保它被读取。由于不涉及volatile类型,并且encoder_value_0不用于任何可观察的行为,编译器可以自由地优化赋值。(即使(void) encoder_value_0;也是如此,因为在C语义中没有可观察的行为。

l7wslrjt

l7wslrjt2#

只读不需要额外的变量。最简单的方法是:

encoder_values[0];
  • 删除(void)-根据@EricPostpischil的建议

假设encoder_valuesvolatile。(如果不是,读取将被优化-所以它必须是。也是硬件寄存器)

void IMT_hw_startup(void) {
    encoder_values[0];
}
yyhrrdl8

yyhrrdl83#

您可以使用pushpop来保存和恢复诊断状态,因此您应该能够执行以下操作:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-but-set-variable"
encoder_value_0 = encoder_values[0];
#pragma GCC diagnostic pop

相关问题