无法解决STM32CubeIDE中的C警告

Can't resolve C warning in STM32CubeIDE

面临一个我无法摆脱的警告。我正在使用带有标准 C11 编译器的 stm32 MCU 和 STM32CubeIDE。函数调用 gpio.c 文件中使用数组 gpioOutPins。包含此函数调用的此函数是从 inOut.c 文件中调用的。 请注意,inOut.c 文件位于用户应用程序层,而 gpio.c 文件位于项目树的内核(核心)部分,如下所示。我无法在快照中容纳整个项目树。

我不明白为什么会产生这个警告。 任何帮助表示赞赏。谢谢。

头文件中定义了一个数组gpio.h:

static uint16_t gpioOutPins[GPIO_OUT_CH_NR] =
{
    DOUT_OD_OUT4_Pin, 
    DOUT_OD_OUT6_Pin, 
    DOUT_OD_OUT5_Pin, 
    DOUT_OD_OUT7_Pin, 
    DOUT_LED_DISABLE_Pin, 
    DOUT_BUZZ_Pin, 
    DOUT_OD_OUT8_Pin, 
    DOUT_OD_OUT3_Pin, 
    DOUT_OD_OUT2_Pin, 
    DOUT_OD_OUT1_Pin, 
    DOUT_ALARM_Pin, 
    DOUT_12V_PWR_Pin, 
    DOUT_12V_PWR_Pin
};

目录结构如下所示:

编译器生成的警告是这样的:

warning: 'gpioOutPins' defined but not used [-Wunused-variable]

Header (.h) 文件不是定义全局变量的好地方,因为当它们包含在源 (.c) 文件中时,它们的多个独立副本就会存在。它们具有相同的名称,但实际上是不同的变量。如果它们不是 static,链接器会因为多个定义而拒绝它们。

你的inOutTask.c可能直接或间接包含gpio.hheader,所以再复制一份gpioOutPins 的出现,这与 gpio.c 中使用的不同。因为您没有在 inOutTask.c 中使用 gpioOutPins,所以您会收到警告。

正确的做法是将定义移入gpio.c,去掉static关键字,在[=20中加入extern uint16_t gpioOutPins[GPIO_OUT_CH_NR]; =]gpio.h