C++多个定义错误

C++ Multiple defintions error

本文关键字:错误 定义 C++      更新时间:2023-10-16

我不想创建代码墙,所以如果你需要任何代码,只要问一下,我就会发布。我有多个定义错误,我不知道为什么。我相信这个错误的发生是因为我试图在一个头文件中声明一个变量(以及在同一个头中为它创建一个对象),然后在4个不同的文件中使用它。对于我在中使用的每个文件,我都得到了多个定义,我给了你一些关于为什么会发生这种情况的想法
请询问是否需要更多信息来解决问题。

我正在使用Code::Blocks-ide mingW编译器并在Windows7上编程

编辑
感谢大家以极快的速度帮助您解决了我的问题:D

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

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

extern int variableIWantOneCopyOfOnly;

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

int variableIWantOneCopyOfOnly;

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

Include保护对多个定义没有帮助,因为它们只会在单个翻译单元中停止包含。

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

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自己的副本,而不是共享副本,因为include-guard的作用域是翻译单元,而不是链接器创建的可执行文件。

您在页眉中使用过include保护吗?一般来说,你想把你的标题结构成这样:

#ifndef _HEADER_FILE_H
#define _HEADER_FILE_H
// actual definitions
#endif

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

"以及在同一标题中为其创建一个对象"

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

如果头被调用,比如x.h,那么创建一个包括头的x.cc(或x.c++、x.cpp或任何您通常做的事情)。将对象的定义移动到其中。编译它并将它与应用程序中的其他对象链接。

多重定义错误意味着您多次声明同一变量。关于你正在做的事情,这是因为你包含了4倍于同一个文件(所以你声明了4倍的变量。

添加预处理器

#ifndef _HEADERFILE_H
#define _HEADERFILE_H
// Your declarations
#endif

或者,如果你正在使用Visual studio,只需将其添加到文件的第一行:

#pragma once

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