ディープ コピーの代わりに代入演算子を使用してポインターを含む構造体をコピーしようとすると警告する GCC 警告はありますか?
質問する
272 次
2 に答える
4
答えはノーだ。gcc警告オプションのリストを参照してください。
同じページの場合、警告は次のとおりです。
警告は、本質的にエラーではないが危険な構造、またはエラーがあった可能性を示唆する構造を報告する診断メッセージです。
また、ディープ コピーの代わりにシャロー コピーを使用することは、意図した動作である可能性があるため、リスクもエラーもありません。したがって、そのような警告オプションが存在する理由はありません。
あなたが望むのは、clang のものなどの静的アナライザーですが、私の知る限り、これはそのような機能を提供していません。
于 2012-11-30T07:26:10.040 に答える
1
そのような警告を正確に見たのを覚えています-Weffc++
もちろん、C++ モードでコンパイルする必要があります。(下記参照)
編集私はそれをテストしました:悲しいことに、これはPOD(つまり)Cタイプについて警告しません。テストは次のとおりです。
struct HasPointer
{
int* resource;
HasPointer() {};
~HasPointer() {};
};
でコンパイル
E:\mingw64>g++ test.c -Weffc++
出力
test.c:1:8: warning: 'struct HasPointer' has pointer data members [-Weffc++]
struct HasPointer
^
test.c:1:8: warning: but does not override 'HasPointer(const HasPointer&)' [-Weffc++]
test.c:1:8: warning: or 'operator=(const HasPointer&)' [-Weffc++]
test.c: In constructor 'HasPointer::HasPointer()':
ただし、ctor/dtor を除外すると、警告も発行されないため、このオプションは、C++ コンパイル モードであってもコードに対して機能しません。
C++ モードでの C コードのコンパイル:
( を使用extern "C"
して) バイナリの相互運用性を実現します。通常は次のように単純です
extern "C"
{
# include "my.h"
# include "stuff.h"
// ...
}
于 2012-11-30T07:29:25.493 に答える