7

宣言して変数を使用しない場合、gccは警告を表示します。

しかし、私が複数のメンバーを持つ構造体を持っていて、それらのいくつかが使用されていない場合、gccはそれについて警告しません...

これらをチェックするオプション(または別の方法)はありますか?

(もちろん、いくつかのエントリを手動で削除して再度コンパイルを試みることはできますが、この種のアプローチを探しています)。

ありがとう

4

2 に答える 2

6

GCC はこれについて警告しません。ほとんどの場合、メンバーが使用されているかどうかを判断できないためです。のかなりの部分がstructヘッダー ファイルで定義されます。これは、アプリケーションだけでなく、.lib を参照するか同じヘッダー ファイルを使用する他のアプリケーションでも使用できます。したがって、現在コンパイルされているコードがメンバーを使用していないからといって、そのメンバーが他のコードによって使用されていないわけではありません。

ローカル変数は異なります。それらが使用されているかどうかは、問題の関数のみをコンパイルすることで簡単に判断できます。したがって、GCC や他の多くのコンパイラは警告を出します。

于 2010-11-02T16:41:02.697 に答える
5

構造体を最初のメンバーのタイプにキャストするだけで、名前を使用せずに、構造体の最初のメンバーに合法かつ移植可能にアクセスできます。

typedef struct {
    int x;
} mystruct;

mystruct s;
*(int*)&s = 3;

非移植性も可能ですが、実質的に100%の信頼性で、互換性のある構造体を持つ別の構造体タイプに構造体をキャストすることにより、名前を使用せずに構造体の任意のフィールドにアクセスできます。

typedef struct {
    int x;
    char y;
} mystruct;

typedef struct {
    int a;
    char b;
} otherstruct;

mystruct s;
((otherstruct*)&s)->b = 'C';

これは、フィールドの名前のソースを検索したり、削除したりすることは、完全に信頼できるものではないことを意味しているのではないかと思います。

于 2010-11-02T16:52:59.747 に答える