我有一些旧的代码,我试图在一个新的(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]) {}
我把这个问题留了下来,以防有更直接的答案。
3条答案
按热度按时间klh5stk11#
如果从
encoder_values[0]
中阅读有硬件副作用,那么它可能是用volatile
声明的,在C中实现这些副作用的方法就是简单地计算encoder_values[0]
,不需要赋值:如果你确实因为某种原因赋值给
encoder_value_0
,并希望抑制编译器关于其值未被使用的警告,那么只需在一条语句中“使用”该值,告诉编译器你故意丢弃它:请注意,如果
encoder_values[0]
没有用volatile
声明,那么写入encoder_values_0 = encoder_values[0];
并不能确保它被读取。由于不涉及volatile
类型,并且encoder_value_0
不用于任何可观察的行为,编译器可以自由地优化赋值。(即使(void) encoder_value_0;
也是如此,因为在C语义中没有可观察的行为。l7wslrjt2#
只读不需要额外的变量。最简单的方法是:
(void)
-根据@EricPostpischil的建议假设
encoder_values
是volatile
。(如果不是,读取将被优化-所以它必须是。也是硬件寄存器)yyhrrdl83#
您可以使用
push
和pop
来保存和恢复诊断状态,因此您应该能够执行以下操作: