【发布时间】:2012-04-08 22:38:27
【问题描述】:
我已经创建了自定义随机数生成器,并将它们的全局函数放在一个名为 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 文件的灵活性。
-
如果它们是全局保留的呢?这很糟糕吗?
标签: c++ file header include conflict