web-dev-qa-db-ja.com

voidはCのデータ型ですか?

voidはCプログラミング言語のデータ型ですか?その場合、どのタイプの値を保存できますか?値を格納するためにintfloatcharなどがある場合、なぜvoidが必要ですか?そして、ボイドの範囲は何ですか?

47
suhel

Voidは(組織的な目的で)データ型と見なされますが、基本的に、「データなし」を表すためにデータ型を配置するプレースホルダーとして使用するキーワードです。

したがって、値を返さないルーチンを次のように宣言できます。

void MyRoutine();

ただし、次のような変数を宣言することはできません。

void bad_variable;

ただし、ポインターとして使用する場合は、意味が異なります。

void* vague_pointer;

これはポインターを宣言しますが、ポインターが指すデータ型を指定しません。

75
James Curran

はい、voidはタイプです。それがdataタイプかどうかは、その用語の定義方法によって異なります。 C標準はサポートしていません。

この規格では、「オブジェクトタイプ」という用語を定義しています。 C99以前。 voidはオブジェクト型ではありません。 C11ではそうです。標準のすべてのバージョンで、void不完全型です。 C11で変更されたのは、不完全な型がオブジェクト型のサブセットになったことです。これは用語の単なる変更です。 (他の種類のタイプは、関数タイプです。)

C99 6.2.6パラグラフ19によると:

voidタイプは、空の値セットで構成されます。完了できない不完全なタイプです。

C11標準は、表現をわずかに変更します。

voidタイプは、空の値セットで構成されます。完了できない不完全なオブジェクトタイプです。

これは、不完全な型を含めるための「オブジェクト型」の定義におけるC11の変更を反映しています。タイプvoidの性質に関する実際の変更はありません。

voidキーワードは、他のコンテキストでも使用できます。

  • int func(void)のように、関数プロトタイプの唯一のパラメータータイプとして、関数にパラメーターがないことを示します。 (C++はこのために空の括弧を使用しますが、Cでは別の意味を持ちます。)

  • void func(int n)のように、関数の戻り型として、関数が結果を返さないことを示します。

  • void*は、それが指すものを指定しないポインター型です。

原則として、これらのすべての使用はtypevoidを参照しますが、これらは単に発生する特別な構文と考えることもできます同じキーワードを使用します。

23
Keith Thompson

C標準では、voidは完了できない不完全な型であると記述されています(完了可能な他の不完全な型とは異なります)。つまり、sizeof演算子をvoidに適用することはできませんが、不完全な型へのポインターを持つことはできます。

5
Jens