【发布时间】:2016-11-17 15:56:38
【问题描述】:
我被讨厌的“单一定义规则”违规所困扰。 我现在害怕我的项目中有很多细微的错误。
例如,以下程序将导致 Visual Studio 2015 的空指针取消引用:
Source1.cpp:
----------
struct S {
double d = 0;
};
void Foo() {
S s;
}
Source2.cpp:
-----------
struct S {
int a = 0;
};
int main() {
int value = 5;
int& valueRef = value;
S s; // valueRef is erased due to S::d initialization from Source1.cpp
valueRef++; // crash
}
编译时没有警告。
这很糟糕,因为Source2.cpp 甚至没有使用来自Source1.cpp 的任何东西。如果我从项目中删除Source1.cpp,它仍然可以编译,并且没有问题了。
在大型项目中,似乎很难确保没有 cpp 文件“本地”定义具有已定义名称的结构或类。
我有一些课程,例如Point、Serie、State、Item,...虽然这在小型 cpp 文件中是可以的,但我意识到这并不安全。
是否有编译器警告来捕获此类错误? 如果没有,避免违反 ODR 的最佳做法是什么?
【问题讨论】:
-
在匿名命名空间中定义它们。
标签: c++ visual-studio visual-c++