我有以下.h文件
#ifndef _EXCEPTION_H
#define _EXCEPTION_H
...
const char* _ErrorCode[] = {
"%s",
"Error: Index is out of range.",
"Error: Stack is empty.",
"Error: New matrix size is not greater than current one.",
"Error: Index or size cannot be negative.",
"Error: Method option is not within permissible options."
"Error: File could not be found or created."
"Error: There was not enough memory to allocate container."
}; // Error code list
...
#endif
包含在许多文件中。但是当我尝试编译时,我收到以下链接器错误:
4 warnings generated.
duplicate symbol __ErrorCode in:
exception.o
graph.o
duplicate symbol __ErrorCode in:
exception.o
io.o
duplicate symbol __ErrorCode in:
exception.o
list.o
duplicate symbol __ErrorCode in:
exception.o
matrix.o
duplicate symbol __ErrorCode in:
exception.o
stack.o
这意味着编译器正在重新定义包含exception.h的所有文件中的_ErrorCode全局变量,即使文件开头有#ifndef也是如此。我如何阻止这种情况发生?如果我不能,我如何定义一个只读数组的字符串,我可以打印出这样的错误?
答案 0 :(得分:1)
如果您在exception.c,graph.c,io.c和项目中的所有其他C源文件中使用#include "exception.h"
,那么这相当于将exception.h的内容复制到每个C源文件的顶部。
这意味着在每个C源文件中,都定义了一个_ErrorCode
变量。当链接每个C源文件中的目标文件时,由于在每个目标文件中定义了__ErrorCode
,这就是命名冲突。
解决方法是使用extern
作为Dabo建议 - 如果您在头文件中使用extern const char* __ErrorCode[];
,那么每个目标文件都会知道在其他地方定义__ErrorCode
变量。然后,您可以在exception.c中定义变量。在链接期间,extern
变量将全部解析为exception.c中定义的__ErrorCode
。
答案 1 :(得分:0)
据我所知,链接器不喜欢在.h文件中初始化全局变量,因为它认为它们在文件的每个实例中都是重新定义的。 解决方案是制作
extern const char* _ErrCode[];
然后在.c做
const char* _ErrCode[] = {...}