私は厄介な "1つの定義ルール"違反で噛まれました。 私のプロジェクトには微妙なバグがたくさんあることを恐れています。1つの定義ルールの警告
たとえば、次のプログラムは、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ファイルでOKでしたが、私が、私はそれが安全ではありません実現します。
このようなバグを検出するコンパイラ警告はありますか? ODR違反を回避するベストプラクティスは何ですか?
匿名名前空間で定義します。 – molbdnilo