我今天下午大部分时间都在追踪一个错误,该错误基本上归结为在Visual Studio 2015中声明同一个类的同一个头文件的两个不同版本。大大简化后,它显示如下;
oldcamera.h
#pragma once
class camera
{
public:
camera();
int a;
double x,y,z;
};
camera.h
#pragma once
class camera
{
public:
camera();
double x,y,z;
};
camera.cpp
#include camera.h
camera::camera()
{
x = y = 0;
z = 1;
};
mytransclass.h
#pragma once
#include "oldcamera.h"
class trans
{
public:
camera m_camera;
};
func.cpp
#include "mytransclass.h"
void MyFunc(trans *ptrans)
{
ptrans->x = 1.0;
ptrans->y = 2.0;
ptrans->z = 3.0;
}
该项目包括camera.cpp和func.cpp,当单步执行MyFunc时,调试器显示分配实际上没有做任何事情。问题是这是否应该在没有警告的情况下进行编译和链接,如果它是合法的(知道可能存在c ++的复杂遗产),为什么分配失败?如果它是合法的,有没有办法将其标记为错误?编译器是Visual C ++ 2015。
答案 0 :(得分:1)
当您#include
某事时,您基本上将该文件复制并粘贴到#include
d的位置。具有相同类定义的多个实际上并不是错误,只要它们不是包含在同一编译单元(cpp)中的相同类定义的多个。如果你这样做,它会破坏一个定义规则。
在你的设置中,oldcamera.h中Camera版本中的函数正在调用为camera.h编写的函数(因为这些函数是唯一被编译的函数,因为你说oldcamera.cpp不是该项目)。但是,这些功能依赖于Camera类的数据布局是某种方式。由于oldcamera.h
Camera
和新camera.h
' Camera
具有不同的数据布局(您没有证明,但我和#39; m假设),狗屎袭击了粉丝。
答案 1 :(得分:1)
您的程序违反了One Definition Rule,特别是([basic.def.odr] / 6):
类型中可以有多个定义(第9条),......在程序中提供每个定义 出现在不同的翻译单元中,并且定义满足以下要求。特定 这样一个名为
D
的实体在多个翻译单元中定义,然后是 (6.1) -D
的每个定义应由相同的令牌序列组成 ...
如果D
的定义不满足这些要求,则行为未定义。