我被一个令人讨厌的“一个定义规则”违规所困扰.
我现在害怕在我的项目中有很多微妙的错误.
我现在害怕在我的项目中有很多微妙的错误.
例如,以下程序将导致使用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违规的最佳做法是什么?