我不希望创建一个代码墙,所以如果您需要任何代码,请询问,我将发布。我收到多个定义错误,我不明白为什么。我相信错误正在发生,因为我试图在一个头文件中声明一个变量(以及在同一个头文件中为它创建一个对象),然后在4个不同的文件中使用它。对于每个文件,我使用头文件我得到了多个定义,我提供了少量信息,为什么会发生这种情况? 请询问是否需要更多信息来解决问题。
我在Windows 7上使用Code :: Blocks ide mingW编译器和编程
修改
谢谢大家的快速帮助,解决了我的问题:D
答案 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'。