C++:文件与自身冲突
C++: File conflicting with itself
>我创建了自定义随机数生成器,并将它们的全局函数放在一个名为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
为什么会这样?我认为预处理器指令应该可以防止此问题发生......这真的让我发疯!!
PS:问题与函数名称无关。
感谢您的任何努力
当您将文件包含在.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()
{
//...
}
标头保护确保不会在单个编译单元(.cpp文件)中多次定义函数。但是,它们不会阻止在多个编译单元中一次性定义函数。这是因为标头包含函数的定义,因此包含标头的每个.cpp都有自己的函数定义。
您可以将定义移动到 SamRandom.cpp并在标头中声明函数,如下所示:
void InitialiseRandomSeed();
或者,您可以指定该函数是内联的,这将使多个定义可以接受:
inline void InitialiseRandomSeed()
{
//...
}
假设该函数不是性能关键型的,并且不经常被调用,我会使用前一种方法。这使标头更具可读性,并且(通常)减少了编译时间。
您可以将
定义分离到一个.cpp文件中,只需在标头中声明该函数。
相关文章:
- 从二进制文件中读取元素时引发异常(引发异常:读取访问冲突. _Pnext 0xB414D4)
- 使用 Win32 读取文件时,glShaderSource 访问冲突
- 包括两个文件 C++ 之间的冲突
- 尝试将 std::cerr 重定向到文件时出现访问冲突异常
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 挂钩创建文件抛出异常:读取访问冲突
- 从文件读取时读取访问冲突
- 如何解决头文件中的变量冲突?
- 错误:多个文件中的结构声明冲突
- C++ h 和 cpp 文件中的指针声明冲突
- 为什么在2.CPP文件中包含此头文件(带头保护)会导致命名冲突
- 在访问冲突时创建转储文件
- C++:使用std::ifstream读取二进制文件后删除缓冲区/指针时发生访问冲突
- 简单Boost文件系统访问冲突
- OpenGL重新定义错误与Windows SDK文件相冲突时
- 当第 4 个(可选)参数为 NULL 时,写入文件将引发访问冲突
- 我创建锁定文件的功能导致访问冲突
- std::getline() 访问冲突,以前可以工作,但现在无法从任何文件中读取
- VLCKit 与 iOS 项目中的 .mm 文件冲突
- 包括文件冲突解决方案