警告C4099:「struct」を使用して表示される「class」を使用して最初に表示される型名(MS VS 2k8)

StackOverflow https://stackoverflow.com/questions/468486

  •  19-08-2019
  •  | 
  •  

質問

この警告は心配する必要がありますか?不規則な動作を引き起こす可能性があることを読んだことがありますか?

これは私がコンパイルしようとしている例です。著者がオブジェクトをクラスとして宣言し、構造体に対してtypedefする理由を誰かに説明してもらえますか?クラスが POD

ありがとう。

役に立ちましたか?

解決

この警告は、別の型宣言と矛盾する型宣言がある場合に表示されます(1つは<!> quot; class <!> quot ;、もう1つは<!> quot; struct <!> quot;と言います)。 1つの定義規則が与えられた場合、多くても1つを除くすべての宣言は前方宣言でなければなりません。この警告は一般に、型の前方宣言が間違っていることを示し、通常は単純なタイプミスであり、修正する必要があります。この場合、副作用はありませんが、実際に修正する必要があります。

ただし、型名の衝突があると、非常に厄介なことが発生する可能性があります(<!> quot; using namespace <!> quot;句またはグローバル名前空間汚染の使用が原因である可能性があります)。これらの警告は、2つの異なるライブラリのヘッダーが混在しており、タイプ名に競合があることを示している可能性があります。これらの条件下でコンパイルされたコードは、非常に予期しないことを行う可能性があります。

私のアドバイス-警告が表示された理由を理解し、修正してください。警告がサードパーティ製品にある場合は、それを修正するよう主張します。

他のヒント

MSaltersによるコメントをこのを上のレベルに投稿します。名前のマングリングで「class」または「struct」キーワードを使用しているVCの結果として、リンカーエラーを見つけるのが困難でした。

それが問題になると思わない場合は、何時間も頭をかきまわされることがあります!

ブログの投稿でこの警告について詳しく説明します<!> quot; C4099は本当に愚かな警告ですか?<!> quot; 。私の結論は、オフにするのが最善だということです。 :-)まあ、少なくとも私にとっては。

Richard Cordenは正しいです-MSがこの警告を出す理由があります。 MSコンパイラの場合、修飾された(マングルされた)名前には、型の宣言に使用される class-key structまたはclass)が含まれます。間違ったクラスキーが表示されているときに、引数としてオブジェクトを受け取る関数またはそのオブジェクトを返す関数がどこかで参照されている場合、コンパイラエラーは発生しませんが、装飾名が異なるためリンカは文句を言います。リンカエラーは、探しているシンボルのみを表示し、そこでクラスキーの不一致を簡単に見落とす可能性があるため、以前の、より詳細なコンパイラ警告が重要です。もちろん、2つのバージョンが同じコンパイルユニットに表示されない可能性があり、デフォルトのメンバーの可視性のみが異なると思われる場合は、しばらく頭を悩ませるでしょう。

マングリングの違いはC ++標準と競合します。C++標準では、struct Foo;class Foo;などの前方宣言は同等であるため、同じマングリングを使用する必要があります。

これは悪い習慣と見なされますが、基本的に同じデータ型であるため、クラス定義と構造体宣言を混ぜても問題はないはずです。主な違いは、プライベートなクラスメンバとは異なり、デフォルトでは構造体メンバはパブリックですが、その他の点ではメモリレイアウトは同一です。

この警告が発生する可能性のあることの1つは、DLLから.tlbファイルを#importしながら、プロジェクト内の参照として同じDLLを使用しようとすることです。プロジェクト内から参照としてDLLを削除することで、この問題を修正しました。

c ++では、クラスと構造体の only の違いは、クラスのメンバー変数、メンバー関数、および基本クラスがデフォルトでプライベートであるのに対し、構造体ではデフォルトでパブリックであるということです。したがって、クラスがPODであるという事実は、ここでは何の違いも生じません。
この警告はコードのメンテナンス(定義はどこかで更新されたが、どこかではなく更新された)から来ていると推測し、警告が消えるようにコードを修正します(たとえば、typedefでクラスを使用します)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top