关于此错误有很多问题。但它们只与一个变量有关。
test.h
namespace World
{
enum Objects
{
TERRAIN = 1,
BOX = 2,
SPHERE = 4,
CAPSULE = 8
};
void WorldObjects2(unsigned int mask)
{
.......
}
}
void test();
TEST.CPP
#include "test.h"
void test()
{
.......
}
的main.cpp
#include "test.h"
int main()
{
test();
return 0;
}
当我在visual stduio 2013上运行这些代码时,它会抛出错误。它说error LNK2005: "void __cdecl World::WorldObjects2(unsigned int)" (?WorldObjects2@World@@YAXI@Z) already defined in main.obj
。如何更正此错误?
答案 0 :(得分:2)
您的项目有两个函数.box:after{
width: 350px;
height: 50px;
bottom: 26px;
display: block;
position:absolute;
content: " ";
z-index: -1;
box-shadow: 0px 19px 8px -5px rgba(0,0,0,0.56);
}
的定义:一个在编译单元WorldObjects2
中,另一个在编译单元test.cpp
中,因为定义函数的头包含在这两个cpp文件。
使用函数说明符main.cpp
inline
或者将函数定义移动到某个cpp文件,只在标题中留下函数声明(没有它的定义)。
另一种方法是使函数具有内部链接。例如,您可以添加关键字static
inline void WorldObjects2(unsigned int mask)
{
.......
}
或者可以将函数放在给定命名空间内的未命名命名空间中。
static void WorldObjects2(unsigned int mask)
{
.......
}
答案 1 :(得分:0)
我建议在test.h文件中使用include guard:
#ifndef TEST_H
#define TEST_H
namespace World
{
enum Objects
{
TERRAIN = 1,
BOX = 2,
SPHERE = 4,
CAPSULE = 8
};
void WorldObjects2(unsigned int mask)
{
.......
}
}
void test();
#endif /* TEST_H */
有些人更喜欢使用#pragma once
而不是if和define组合,但结果并不重要。
这两个选项将阻止编译器两次添加相同的头文件。如果两次添加相同的头文件,您不仅可以创建遇到的错误,还可以增加编译时间。