gpt4 book ai didi

C++:文件与自身冲突

转载 作者:太空宇宙 更新时间:2023-11-04 16:28:01 24 4
gpt4 key购买 nike

我已经创建了自定义随机数生成器并将它们的全局函数放在一个名为 SamRandom.h 的文件中。该文件如下所示:

#ifndef _SAM_RANDOM_H
#define _SAM_RANDOM_H

#include <cstdlib>
#include <ctime>

void InitialiseRandomSeed()
{
//...
}

//...

#endif

我在一个非常复杂的面向对象的程序中工作,它有许多不同的组件。每次我添加一个与该文件相关的文件时,我都会收到以下冲突消息:

LaserBase.obj:-1: error: LNK2005: "void __cdecl InitialiseRandomSeed(void)" (?InitialiseRandomSeed@@YAXXZ) already defined in main.obj
error: LNK1169: one or more multiply defined symbols found

在 MSVC 和 MinGW 上我得到:

In function `Z20InitialiseRandomSeedv':
SamRandom.h:8: multiple definition of `InitialiseRandomSeed()'
error: first defined here
:-1: error: collect2: ld returned 1 exit status

为什么会这样?我认为预处理器指令应该可以防止这个问题发生......这真的让我发疯!!!

P.S.:问题与函数名称无关。

感谢您的努力

最佳答案

当您将文件包含在 .cpp 文件中时,预处理器会直接将其复制到该文件中。因此,当您编译该 .cpp 文件时,目标文件(即使您不认识编译器也总是这样做的一个步骤)将包含该函数。如果将它包含在多个 .cpp 文件中,每个目标文件都将包含该函数。当链接器尝试将所有目标文件链接到可执行文件时,它会找到函数 x 次并给出该错误。“找到一个或多个多次定义的符号”表示它不止一次找到您的一个函数(或变量)并且不知道如何处理它。

为了避免这种情况,您应该只放置函数的签名,例如

//whatever.h
#ifndef _SAM_RANDOM_H
#define _SAM_RANDOM_H

void InitialiseRandomSeed();

#endif

在头文件中并将实现放入单独的 .cpp 文件中:

//whatever.cpp
#include "whatever.h"
#include <cstdlib>
#include <ctime>

void InitialiseRandomSeed()
{
//...
}

关于C++:文件与自身冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10067129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com