C ++多个定义错误

时间:2011-06-21 08:58:25

标签: c++

我不希望创建一个代码墙,所以如果您需要任何代码,请询问,我将发布。我收到多个定义错误,我不明白为什么。我相信错误正在发生,因为我试图在一个头文件中声明一个变量(以及在同一个头文件中为它创建一个对象),然后在4个不同的文件中使用它。对于每个文件,我使用头文件我得到了多个定义,我提供了少量信息,为什么会发生这种情况? 请询问是否需要更多信息来解决问题。

我在Windows 7上使用Code :: Blocks ide mingW编译器和编程

修改
谢谢大家的快速帮助,解决了我的问题:D

5 个答案:

答案 0 :(得分:5)

您是否在标题中使用了include guards?通常,您希望将标题结构如下:

#ifndef _HEADER_FILE_H
#define _HEADER_FILE_H

// actual definitions

#endif

还有#pragma once,但这不是标准。

答案 1 :(得分:5)

不要在头文件中声明它(虽然从技术上讲,我的意思是在那里定义)。

在你的头文件中你应该有:

extern int variableIWantOneCopyOfOnly;

然后,在您要链接的单个C源文件中,输入:

int variableIWantOneCopyOfOnly;

前者会让所有源文件都知道变量的存在,但不为它分配空间。包含第二行的单个翻译单元将为其分配空间,链接器将修复对它的所有引用。

包含警卫不会对多个定义有所帮助,因为它们只会阻止包含在单个翻译单元中。

我的意思是,如果您有以下文件:

xyz.h:               xyz1.c:                   xyz2.c:
    #ifnef XYZ           #include "xyz.h"          #include "xyz.h"
        #define XYZ
        int a;
    #endif

然后执行如下命令:

gcc xyz1.c xyz2.c

然后他们都将获得a自己的副本,而不是共享副本,因为包含保护的范围是翻译单元,而不是链接器创建的可执行文件。

答案 2 :(得分:4)

  

“以及在同一标题中为它创建一个对象”

如果您在标题中定义内容,然后尝试链接包含该标题的多个翻译单元中的对象,则会出现多个定义错误。

如果标题名为x.h,则创建包含标题的x.cc(或x.c ++,x.cpp或其他通常做的)。在那里移动对象的定义。编译它并将其与应用程序中的其他对象链接。

答案 3 :(得分:1)

多重定义错误意味着您多次声明同一个变量。关于你在做什么,这是因为你要包含相同文件的4倍(因此你声明了4倍的变量。

添加预处理器

#ifndef _HEADERFILE_H
#define _HEADERFILE_H

// Your declarations

#endif

或者如果您使用的是Visual Studio,只需在文件的第一行添加:

#pragma once

答案 4 :(得分:1)

您应该将实际定义移动到c ++(.cc .cpp whatever)文件中,并且只将声明留在标题中。此外,您还需要在声明前加上'extern'。