链接器错误与.h文件中的全局变量

时间:2014-03-09 20:10:18

标签: c global-variables header-files

我有以下.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也是如此。我如何阻止这种情况发生?如果我不能,我如何定义一个只读数组的字符串,我可以打印出这样的错误?

2 个答案:

答案 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[] = {...}