两个本地结构,每个都在单独的cpp文件中-未定义的行为
Two local struct, each in separate cpp file - undefined behavior?
如果我有两个具有相同名称的struct
,但它们都被写入自己的.cpp文件中,那么它真的应该是未定义的行为吗?
///////////////////////////////
// test1.h
class Foo
{
public :
void bar();
};
///////////////////////////////
// test2.h
class Foo2
{
public:
void bar();
};
///////////////////////////////
// test1.cpp
#include "test1.h"
struct Test
{
Test() :a(0){}
int a;
};
void Foo::bar()
{
Test t;
}
///////////////////////////////
// test2.cpp
#include "test2.h"
struct Test
{
Test() :a(0), b(0){}
int a, b;
};
void Foo2::bar()
{
Test t;
}
///////////////////////////////
// main.cpp
#include "test1.h"
#include "test2.h"
int main()
{
Foo2 f;
f.bar();
}
我已经向微软报告了这是一个错误,但他们回应说,这是未定义的。真的吗?我觉得很奇怪。
这确实给出了未定义的行为。"一个定义规则"的一部分指出,如果在多个翻译单元中定义具有外部链接的同一类,则定义必须相同。(该规则的确切措辞相当冗长,所以我不会引用它;如果你想了解血腥的细节,请参阅C++11 3.2/5)。通过在两个翻译单位中以不同的方式定义Test
,可以打破这一规则。
避免这种名称冲突的最简单方法是将文件本地的定义放在未命名的命名空间中:
namespace {
struct Test {
// whatever
};
}
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 为什么我的主文件.cpp不打印头文件中的任何内容
- 生成文件错误 - 找不到文件 - *.cpp
- 如何在文件.cpp gtkmm中声明小部件
- 没有实现文件(.cpp)的派生类
- 如何使用"CMakeLists.txt"中的add_library将整个文件(.cpp,.h等)包含在目录中
- 如何在Linux / Windows操作系统上使用文件*.cpp一步编译下面的代码
- 关于 Linux .so 文件无法链接到主文件.cpp文件
- 文件.cpp从Windows到Linux
- Ubuntu C++ 编译器错误: g++: 错误: 文件.cpp: 没有这样的文件或目录
- 如何将文件.cpp编译为本机编译
- 使用模板类时,似乎无法包含除 main 以外的任何 cpp 文件.cpp
- 无法编译C++文件.cpp。C++98模式
- 为什么C++头文件不需要包含实现文件 (.cpp)
- 如何访问位于独立文件(.cpp)中的非成员函数
- 如何在Visual Studio Code中通过键盘快捷键切换头文件/cpp文件
- 如何将数据从stringstream写入文件(CPP)
- 为什么filestream不把空白写入文件cpp ?