我知道这个问题已被多次询问,但我的情况有点不同,或者我喜欢思考。
所以我有一个.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
答案 0 :(得分:3)
以前曾多次提出同样的问题。你的完全没有什么不同。
包含警卫与防止具有外部链接的实体的多个定义完全无关。这是一个完全不同的故事。你遇到的问题与包括警卫完全无关。
您在头文件中将EBCDICtoASCIItable
定义为具有外部链接的对象。然后,您将该标题包含在许多翻译单元中。这产生了EBCDICtoASCIItable
的多个定义,触发了链接器错误。
不要尝试在头文件中使用外部链接(对象或函数)定义实体。它不会起作用。包括警卫不会帮助你使它工作。在头文件
中放置数组的声明extern unsigned char EBCDICtoASCIItable[256];
并将定义移动到某个(仅一个)实现文件
unsigned char EBCDICtoASCIItable[256] = {... , ... blah blah blah };