【C言語】ポインタ(8)インコンプリート型:void とは

どうも。gochaです。

今回は、インコンプリート型についてです。“インコンプリート”を日本語に直すと“不完全”となるので、不完全型と言われることもあります。

6.2.5 Types(型)のところに記載されていますので、あわせてみていきます。

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf#page=45

6.2.5 Types

1. The meaning of a value stored in an object or returned by a function is determined by the type of the expression used to access it. (An identifier declared to be an object is the simplest such expression; the type is specified in the declaration of the identifier.)Types are partitioned into object types (types that fully describe objects), function types (types that describe functions), and incomplete types (types that describe objects but lack information needed to determine their sizes).

参照:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf#page=45

日本語訳は下記のような感じでしょうか。

6.2.5 型

オブジェクトの中に保存されている値の意味、もしくは関数の返り値に格納されている値の意味は、それらにアクセスするときに明示され使用される型によって決定される。(オブジェクトを宣言する際に使用される識別子が最も単純な例;つまり、識別子の宣言時に使用される型のこと。)型にはオブジェクト型 (オブジェクトの特徴を十分に説明する型), ファンクション型 (ファンクションの特徴を説明する型), そしてインコンプリート型(オブジェクトの特徴を説明するが、オブジェクトのサイズを決定する情報が欠けているもの)に分別される。

凝縮します。

インコンプリート型(オブジェクトの特徴を説明するが、オブジェクトのサイズを決定する情報が欠けているもの)に分別される。

インコンプリート型は、オブジェクトのサイズを決定できていない型。

具体的には、下記のようなものがあります。

  • A void type.
  • An array type of unknown size.
  • A structure or union type of unknown content.

void型を説明します。

19. The void type comprises an empty set of values; it is an incomplete type that cannot be completed.

参照:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf#page=47

直訳すると、void型は値の空集合を構成する。完成され得ないので、インコンプリート型である。

ですが、私は下記のように理解しています。上記のvalues がC言語で特別な意味を持つのが理解する鍵です。

上で述べたとおり、インコンプリート型とは下記の定義でした。

インコンプリート型は、オブジェクトの特徴を説明するが、オブジェクトのサイズを決定できない型。

void型で宣言された場合、オブジェクトのサイズはvoid型であるかぎり決定できない。なので、インコンプリート型と言えるということだと私は理解しています。

C言語では、値というのは、

特定の型によって参照されることで初めて正確な意味をもつオブジェクトの中身のこと

です。

英語の本来の意味の value = 価値 の意味を含んでいるのかなと考えてます。
ただし、ご紹介している規格書の中ですら、明らかに定義されている内容と違う意味で、valueという言葉を使っているように見えるケースもあり、また、英語のvalue が日本語で言うと多数の意味を含むことから、非常に分かりづらいのかなと考えています。

また、void型を有するobject の中身は値と呼べない。つまり、どんなobject を何個作ろうとも、void型を有するobject である限りvalueを持たないので、それらのobjectの集合はvalue空集合(要素を持たない集合のこと)となると理解しています。

今回はここまで。