当我在source.h中只定义了一次指定的变量时,为什么会出现“多重定义”错误?

时间:2015-01-18 06:31:50

标签: c

我正在开发一个读取NFC卡的程序,我有一个头文件source.h,它包含所有变量,用于它的相关源代码source.c。样本如下所示:

#ifdef __cplusplus
extern "C" {
#endif

int SDA_SUPPORT_PRESENT = 0;
int DDA_SUPPORT_PRESENT = 0;
int CDA_SUPPORT_PRESENT = 0;
int CARDHOLDER_VERIFICATION_PRESENT = 0;
...

源代码source.c使用上面定义的变量来保存方法。样本如下所示:

#include <source.h>

extern void translateError(uint8 error, int slot) //one of the methods
{
    TP_DbgSerialPrn("\n\rDevice Error: ");
    switch(error)
    {
...

我还有一个源文件CardReader.c,它调用source.c中包含的方法,并且有一个相关的头文件CardReader.h。问题是,当我在CardReader.h文件中包含source.h文件时,我收到以下错误:

../CardReader.o:(.bss+0x12b4): first defined here
../source.o:(.bss+0x12b8): multiple definition of `SLOT_NUMBER'
../CardReader.o:(.bss+0x12b8): first defined here
../source.o:(.data+0x49): multiple definition of `LISTED_APPLICATION_IDS'
../CardReader.o:(.data+0x49): first defined here
../source.o:(.data+0xc9): multiple definition of `LISTED_APPLICATION_IDS_LENGTH'

所有其他错误消息属于同一类型。 source.h文件包含在CardReader.h中:

#include <TPCardReader.h> 
#include <source.h>

#ifdef __cplusplus
extern "C" {
#endif
...

路径变量设置正确,因此可以找到它,然后像往常一样在CardReader.c中调用CardReader.h文件。我的问题是为什么会出现这个错误,但我只在source.h中定义了一次指定的变量?有什么东西丢失或没有做或我不理解错误?

1 个答案:

答案 0 :(得分:1)

不应在头文件中定义变量。

而是在头文件中你应该

extern int SDA_SUPPORT_PRESENT;

然后在源(.c)文件中你应该

int SDA_SUPPORT_PRESENT = 0;

这将确保您只有一个变量

的定义

但是,全球变量再次成为一个坏主意