'的多个定义'在C.

时间:2014-07-21 16:31:34

标签: c header c-preprocessor

我知道这个问题已被多次询问,但我的情况有点不同,或者我喜欢思考。

所以我有一个.h文件,我用于宏和结构定义,什么不是。我确实通过平常保护......

#ifndef DEFINITIONS_H
#define DEFINITIONS_H

#define some_macro ....

enum TYPE {.,.,.,.,};

typedef struct Blah{
    ...
    ...
}Blah_t;

#endif

...在我尝试添加数组

之前,这已经完全正常了
unsigned char EBCDICtoASCIItable[256] = {... , ... blah blah blah };

这会导致编译错误:EBCDICtoASCIItable'的多重定义,首先在此定义 - > main.o :(。数据+为0x0)

我的所有其他头文件都有适当的防护。我的.h文件只包含必要的.h文件。我的.c文件只包含各自的.h文件,后跟标准库。

奇怪的是我有四组.h / .c文件使用我的definitions.h文件,我没有将它包含在我的main.c中。然而,我已经在main.o中定义了四个关于它的投诉。

如果有帮助,这是我的makefile ......

cbase_deux : main.o fileio.o utilities.o cfgFileManager.o communication.o
        gcc -o cbase_deux -g main.o fileio.o utilities.o cfgFileManager.o communication.o

main.o : main.c
        gcc -Wall -pedantic -c main.c -g
fileio.o : fileio.c
        gcc -Wall -pedantic -c fileio.c -g
utilities.o : utilities.c
        gcc -Wall -pedantic -c utilities.c -g
cfgFileManager.o : cfgFileManager.c
        gcc -Wall -pedantic -c cfgFileManager.c -g
communication.o : communication.c
        gcc -Wall -pedantic -c communication.c -g
clean :
        rm cbase_deux main.o fileio.o utilities.o cfgFileManager.o communication.o

1 个答案:

答案 0 :(得分:3)

以前曾多次提出同样的问题。你的完全没有什么不同。

包含警卫与防止具有外部链接的实体的多个定义完全无关。这是一个完全不同的故事。你遇到的问题与包括警卫完全无关。

您在头文件中将EBCDICtoASCIItable定义为具有外部链接的对象。然后,您将该标题包含在许多翻译单元中。这产生了EBCDICtoASCIItable的多个定义,触发了链接器错误。

不要尝试在头文件中使用外部链接(对象或函数)定义实体。它不会起作用。包括警卫不会帮助你使它工作。在头文件

中放置数组的声明
extern unsigned char EBCDICtoASCIItable[256];

并将定义移动到某个(仅一个)实现文件

unsigned char EBCDICtoASCIItable[256] = {... , ... blah blah blah };