4

次のような C++ コードをよく見かけます。

void foo()
{
  struct sockaddr* from;
  // ...
}

なぜstruct指定子が必要なのですか? それは実際に何かをしますか?コンパイラはsockaddr構造体として宣言されていることを既に認識しているため、なぜこれが有用または必要なのか疑問に思います。

過去に削除しようとしましたが、動作に違いはありませんでしたが、安全に削除できるとは確信していません。

同様に、これら2つの違いは何ですか?

sizeof(struct sockaddr)
sizeof(sockaddr)
4

4 に答える 4

5

コーディングの「スタイル」として、これはキーワードが必要な C の遺産である可能性が最も高いです。

C++ では、これはほとんどの状況で必要ありませんが、コンパイラに名前を他のエンティティ (次の例の変数など) の名前ではなく型の名前に解決させるために使用されることがあります。

struct x
{
};

int main()
{
    int x = 42;
    struct x* pX = nullptr; // Would give a compiler error without struct
}

個人的には、変数や型と同じ名前の関数を持つスタイルが良いとは考えていませんstruct。この目的でキーワードを使用する必要はまったくありませんが、言語ではそれが可能です。

于 2013-06-21T21:03:34.360 に答える
1

このようなコードは、(適切なステートメントstructを追加しない限り) 構造体として定義されている型の名前の前にキーワードが必要なC から直接取得されます (ほとんどの場合、コピー & ペーストによって)。typedefこの方法での使用structは、下位互換性のために C++ で引き続きサポートされていますが、C++ では型名としてstruct foo { ... };自動的に追加されるため、(通常) 後で型を単に として参照しても安全です。foofoo

于 2013-06-21T21:04:18.960 に答える