C++多个定义错误

I P*_*m I 1 c++

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

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

编辑
感谢大家的快速帮助,解决了我的问题:D

Ste*_*ard 5

你在标题中使用了包含守卫吗?通常,您希望将头部结构如下:

#ifndef _HEADER_FILE_H
#define _HEADER_FILE_H

// actual definitions

#endif
Run Code Online (Sandbox Code Playgroud)

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


pax*_*blo 5

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

在您的头文件中,您应该:

extern int variableIWantOneCopyOfOnly;
Run Code Online (Sandbox Code Playgroud)

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

int variableIWantOneCopyOfOnly;
Run Code Online (Sandbox Code Playgroud)

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

包含警卫对多个定义没有帮助,因为它们只停止包含在单个翻译单元中.

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

xyz.h:               xyz1.c:                   xyz2.c:
    #ifnef XYZ           #include "xyz.h"          #include "xyz.h"
        #define XYZ
        int a;
    #endif
Run Code Online (Sandbox Code Playgroud)

并执行如下命令:

gcc xyz1.c xyz2.c
Run Code Online (Sandbox Code Playgroud)

然后他们都会得到自己的副本a,而不是共享副本,因为include guard的范围是翻译单元,而不是链接器创建的可执行文件.