3

2つの異なるヘッダーファイルを作成しました。それぞれに同じ名前のクラスが含まれており、それぞれが異なるcppファイルに含まれているため、コンパイラーはそれらの再定義について文句を言いません。

これらは2つの異なるクラスのように動作しますが、同じメソッド、同じ名前、同じ引数がある場合を除き、次のように1つだけが呼び出されます。

//on first cpp:
#include "same1.h"
//...
SameName obj(int_value);
obj.ok(int_value);
obj.not_ok();

//on second cpp
#include "same2.h"
//...
SameName obj(float_value);
obj.ok(float_value);
obj.not_ok();

両方のファイルで、same1.hからnot_okが呼び出されますが、もちろん正しく初期化されていません

私は問題が何であるか、そしてなぜこれが起こるのかを知っています。私は名前マングリングにも精通しており、コンパイル時に両方がまったく同じ名前を持っていることを知っています。

それがC++の標準的な動作なのか、それとも私のコンパイラがどのように実装したのか、つまり、すべてのコンパイラがこの状況で同じことを行うべきかどうかを知りたいだけです。

私はDebianLinuxでgcc4.7.1を使用していることに言及する必要があります。

4

3 に答える 3

4

これは、OneDefinitlionRuleおよび未定義動作の違反です。

于 2012-08-11T19:46:09.720 に答える
3

この標準では、この特定のルールに違反すると、未定義の動作が呼び出されるとされています。したがって、あなたのケースには標準的な振る舞いはありません。しかし、あなたはそれが機能しないことを期待することができます。「何か」は「未定義動作」の一部であるため、コンパイラは何かを実行することで標準に準拠しています。

于 2012-08-11T19:50:09.047 に答える
2

プログラムに同じクラスの2つの異なる定義を含めることにより、C++の規則に違反しています。したがって、プログラムの動作は定義されていません。

于 2012-08-11T19:48:09.600 に答える