4

ディープ コピーの代わりに代入演算子を使用してポインターを含む構造体をコピーしようとすると警告する GCC 警告はありますか?

4

2 に答える 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 に答える