C 多重定义。。。连接错误

C 多重定义。。。连接错误,c,linker,linker-errors,C,Linker,Linker Errors,我定义了一个特殊文件:config.h 我的项目还包含以下文件: t.c, t.h pp.c, pp.h b.c b.h l.cpp 和#包括: 在t.c: #include "t.h" #include "b.h" #include "pp.h" #include "config.h" #include "pp.h" #include "config.h" #include "pp.h" #include "t.h"

我定义了一个特殊文件:
config.h

我的项目还包含以下文件:

t.c, t.h
pp.c, pp.h
b.c b.h
l.cpp
和#包括:

在t.c:

    #include "t.h"
    #include "b.h"
    #include "pp.h"
    #include "config.h"
    #include "pp.h"
    #include "config.h"
    #include "pp.h"
    #include "t.h"
    #include "config.h"
卑诗省:

    #include "b.h"
    #include "pp.h"
在pp.c:

    #include "t.h"
    #include "b.h"
    #include "pp.h"
    #include "config.h"
    #include "pp.h"
    #include "config.h"
    #include "pp.h"
    #include "t.h"
    #include "config.h"
在l.cpp中:

    #include "t.h"
    #include "b.h"
    #include "pp.h"
    #include "config.h"
    #include "pp.h"
    #include "config.h"
    #include "pp.h"
    #include "t.h"
    #include "config.h"
我的
*.h
文件中没有include指令,只有
*.c
文件中有include指令。我在config.h中定义了这一点:

const char *names[i] =
        {
            "brian", "stefan", "steve"
        };
需要在l.cpp,t.c,pp.c中使用该数组,但我遇到了以下错误:

pp.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
t.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [link] Error 1

我在我的项目中使用的每个
*.h
文件中都包含了警卫。解决这个问题有什么帮助吗?

不要在标题中定义变量。将声明放在头文件中,将定义放在一个.c文件中

在config.h中

extern const char *names[];
在某些.c文件中:

const char *names[] =
    {
        "brian", "stefan", "steve"
    };

如果将全局变量的定义放在头文件中,则此定义将转到包含此头文件的每个.c文件,您将得到多个定义错误,因为变量可能声明多次,但只能定义一次。

公共函数的声明放在头文件中,是,但是定义在标题中也是绝对有效的!如果要在实用程序函数的头中定义不希望在每个c文件中再次定义的内容,则可以将该定义声明为静态(整个程序只允许1个副本)。例如,定义枚举和静态函数以将枚举转换为字符串。这样,您就不必为每个包含标头的.c文件重写枚举到字符串转换器。:)

已解决!:)你能告诉我为什么我不应该把声明放在
h*
文件中吗?这样它就不会这样做了。使用*.h文件只是为了参考信息。您必须记住,“include”意味着它包含该文件中的所有*.h信息,因此您可以使用*.h将该信息(不仅仅是引用)复制到每个文件中。这可能会使链接器混淆,确实如此。@mazix不,全局变量的定义应该放在.c文件中,并将声明放在标题中。请记住,可以多次声明变量,但只能定义一次。为了让解释更清楚一点,头文件可能包含在多个c文件中,因此,您将得到一个具有相同名称的变量的多个声明。是否可以将
extern
用于类构造函数?是否可能重复debian的最近更改?直到几天之前,我的项目还很顺利。。。。在最近的更新(我正在进行debian测试)之后,我开始出现这个错误(即使是我在几天前标记的版本,并且工作正常)。我发现这个答案比最上面的答案方便得多。例如,使用一个头来存储所有全局变量比使用.h和.cpp文件更方便、更吸引人。谢谢。我认为这个解决方案比大多数投票的解决方案更好,因为其他解决方案需要在每个*.c文件中定义值,而且你的@JonathanWhittenberg看起来更优雅。感谢您提供了比AA更好、更优雅的解决方案+1添加为什么它并不总是一个坏主意。这并不是对静态的准确描述。“您可以将定义声明为静态(整个程序只允许一个副本)”否!static将定义的范围限定到该编译单元。因此,它为每个编译单元提供一个副本。因此,如果您有一些大的字符串列表,您的程序将最终有许多重复的列表副本。。。每个c文件一个。对于静态函数来说,如果稍后进行调试,情况会更糟,因为不再有一个函数可以放置断点,而是在生成的链接程序中有该函数的多个副本。