在头文件中使用变量,重复定义错误

Use of variable in header files, duplicate definition error

我遇到了重复定义错误的问题。 我必须在其他文件调用的头文件中写一个常量,但发生了这个错误,我不知道如何解决它。 我尝试使用包含防护,但它不起作用。

#ifndef _DEFINE_PORTS__H___INCLUDED
#define _DEFINE_PORTS__H___INCLUDED


#define GPIO_SWPWM_PORT              GPIOB

const uint16_t GPIO_SWPVM_LEDS[12] = {GPIO_Pin_0 , GPIO_Pin_1 , GPIO_Pin_2 ,
                                      GPIO_Pin_3 , GPIO_Pin_4 , GPIO_Pin_5 ,
                                      GPIO_Pin_6 , GPIO_Pin_7 , GPIO_Pin_8 ,
                                      GPIO_Pin_10 , GPIO_Pin_12 , GPIO_Pin_14};


#endif // _DEFINE_PORTS__H___INCLUDED

下面报错(这样的比较多);

Error[Li006]: duplicate definitions for "GPIO_SWPVM_LEDS"; in "C:\Andrea\Dev\stm32\ew\Debug\Obj\App.o", and "C:\Andrea\Dev\stm32\ew\Debug\Obj\AppEeprom.o" 

头文件守卫在这里无济于事,它们仅解决在同一编译单元(即 .c 文件)中多次包含头文件的问题。

这里你在头文件中定义了一个非静态变量。如果这样做,所有包含此头文件的 .c 文件都将干净地编译,但在链接过程中,所有这些变量都将被多重定义。这就像将函数定义放入头文件中一样。

你应该在你的头文件中包含这个:

static const uint16_t GPIO_SWPVM_LEDS[12] = {......};

...或者在头文件中包含这个(这样更干净,因为 const 变量只存在 一次):

extern const int GPIO_SWPVM_LEDS[12];

并将变量定义放入 一个 .c 文件中:

const uint16_t GPIO_SWPVM_LEDS[12] = {......};

阅读这篇 SO 文章了解更多信息:

  • How do I use extern to share variables between source files?