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

问题描述 投票:0回答:2

我正在尝试在新的编译器(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]) {}

我将保留这个问题,以防有更直接的答案。

c compiler-warnings armclang
2个回答
0
投票

如果从

encoder_values[0]
读取有硬件副作用,那么可能是用
volatile
声明的,并且在 C 中影响这些副作用的方法就是简单地评估
encoder_values[0]
,无需赋值:

encoder_values[0];

如果您出于某种原因确实分配给

encoder_value_0
并且想要抑制编译器关于其值未被使用的警告,那么只需在语句中“使用”该值,告诉编译器您正在故意丢弃它:

(void) encoder_value_0;

0
投票

最简单的方法是:

(void)encoder_values[0];

假设

encoder_values
volatile
。 (如果不是,无论如何读取都会被优化 - 所以它必须是。它也是硬件寄存器)

void IMT_hw_startup(void) {
    (void)encoder_values[0];
}
© www.soinside.com 2019 - 2024. All rights reserved.