web-dev-qa-db-ja.com

CがC ++ではなく「struct」キーワードを必要とするのはなぜですか?

私はいつもここで何が起こっているのかについて少し混乱してきました:

#include <stdio.h>

int main() {  
    timeval tv;
    tv.tv_sec = 1;

    for (;;) {
        select(0, 0, 0, 0, &tv);
        printf("%s\n", "Hello World!");
    }
}

それがコンパイルされない場合は申し訳ありませんが、簡単な例としてそれを書いてください。

このようなコードは、struct timevalを使用する前にキーワードstructを追加しない限り、gccでコンパイルされません。一方、g ++はそのまま問題なく処理します。

これは、CとC++が構造を処理する方法の違いですか、それともコンパイラーの違いですか? (私は非常にC++指向であり、このような行でCでstructを使用すると、常に多少困惑します)。

構文的には、どちらもstructをほぼ同じように扱います。 C++のみが、曖昧さがなければstruct(およびclass)キーワードを省略できる追加のルールを追加しました。

あいまいな場合は、C++でもstructキーワードを必要とする場所があります。悪名高い例は、struct statと関数statがあるPOSIXシステムでのstatです。

77
Jens Gustedt

C++の最初のアイデア(または単に「クラスでのC」というアイデアだった場合)、つまり、ほとんどの有効なCプログラムが有効なC++プログラムになるまで、Cと互換性のあるOO指向言語のアイデアを考えてみてください。

C++は、Cのstructから始めて、さらにいくつかの機能を追加することにより、クラスモデルを構築しました。

  1. 継承(ただし、構造体の最初のメンバーを「継承」する構造体にすることで、Cに近づくことができます)。
  2. 情報の隠蔽(publicprivateなどを介して)
  3. メンバーメソッド(元々はマクロによって構造体の外部でthisパラメーターが追加されたCコードに変換されました-多くの実装は実際にはまだ似ています)。

この時点で2つの問題がありました。 1つ目は、Cには情報隠蔽がなく、C++の観点からはすべてが公開されているため、デフォルトのアクセスは公開する必要があるということです。良いOOデフォルトでprivateにする必要があります。これはclassを追加することで解決されました。これは、デフォルトがstructではなくprivateであることを除いて、publicとほぼ同じです。

もう1つは、このOO=パースペクティブに、timevalまたは他のクラス/構造がintまたはcharと同じ「フッター」上にあり、コード内で常に特別な注釈が付けられるわけではないことです。これはその型の変数を宣言する際に、型の名前の前にstruct(またはclass)を配置する必要があるという規則を緩和します。したがって、struct timeval tv になることができる timeval tv

その後、これは後のC構文OO言語、たとえばJavaおよびC#のように、短い形式(timeval tv)はC#では有効な構文です。

11
Jon Hanna

それは両方の言語の設計上の決定だと思います。

Cの構造体は単なる構造化レコードであり、組み込みタイプとは使用法が異なります。

C++にはctorと演算子のオーバーロードがあるため、これらは型として機能します。

struct foo x;         // create a structure of pattern foo
typedef foo foo_type; // "define" a type
foo_type x;           // create an instance of type foo_type

C++:

foo x; // create an instance of type foo

補足として、struct fooはC++でも引き続き許可されます。 struct fooは、名前の検索が簡単なので、typedef'd fooよりも解析が簡単です。

11
Pubby

Cはこのように見えます。したがって、Cでは次のパターンがかなり一般的です。

typedef struct YourStructure
{
   int x;
   // more fields
} YourStructure;

次に、C++の場合と同じ方法で参照できます。

8
Krizz

それは単に言語の違いです。 C++は、その構造体構文においてより寛容です。

7
David Heffernan

もちろん、Cのやり方が最初に来ました。 C++の構造体とクラスはほぼ同じであり、すべてのクラス変数でclassを要求するのは非常に不便だったため、両方で簡略化されました。

3
Mark Ransom