我正在尝试在新的编译器(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
的属性。
还有一个好奇心——不如上面的主要问题重要:“二手”的实际含义似乎不一致。根据上面的警告,该变量是notused;这似乎很明确。
但是如果我添加未使用的属性:
uint32_t encoder_value_0 __attribute((unused));
然后我收到警告
warning: 'encoder_value_0' was marked unused but was used [-Wused-but-marked-unused]
,其中变量被赋值(函数中的最终语句)。我看不出有什么其他解释——这与上述警告直接矛盾。分配要么是“使用”,要么不是。
无论如何,如何单独抑制这种情况下的警告,以便我可以在其他地方保持警告处于活动状态?
编辑:按照建议,更改从encoder_values指针读取的方法确实可以通过消除对变量的需要来解决问题:
if (encoder_values[0]) {}
我将保留这个问题,以防有更直接的答案。
如果从
encoder_values[0]
读取有硬件副作用,那么可能是用 volatile
声明的,并且在 C 中影响这些副作用的方法就是简单地评估 encoder_values[0]
,无需赋值:
encoder_values[0];
如果您出于某种原因确实分配给
encoder_value_0
并且想要抑制编译器关于其值未被使用的警告,那么只需在语句中“使用”该值,告诉编译器您正在故意丢弃它:
(void) encoder_value_0;
最简单的方法是:
(void)encoder_values[0];
假设
encoder_values
是volatile
。 (如果不是,无论如何读取都会被优化 - 所以它必须是。它也是硬件寄存器)
void IMT_hw_startup(void) {
(void)encoder_values[0];
}