私はいつもここで何が起こっているのかについて少し混乱してきました:
#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
です。
C++の最初のアイデア(または単に「クラスでのC」というアイデアだった場合)、つまり、ほとんどの有効なCプログラムが有効なC++プログラムになるまで、Cと互換性のあるOO指向言語のアイデアを考えてみてください。
C++は、Cのstruct
から始めて、さらにいくつかの機能を追加することにより、クラスモデルを構築しました。
public
、private
などを介して)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#では有効な構文です。
それは両方の言語の設計上の決定だと思います。
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
よりも解析が簡単です。
Cはこのように見えます。したがって、Cでは次のパターンがかなり一般的です。
typedef struct YourStructure
{
int x;
// more fields
} YourStructure;
次に、C++の場合と同じ方法で参照できます。
それは単に言語の違いです。 C++は、その構造体構文においてより寛容です。
もちろん、Cのやり方が最初に来ました。 C++の構造体とクラスはほぼ同じであり、すべてのクラス変数でclass
を要求するのは非常に不便だったため、両方で簡略化されました。