CやAlgol68から派生したいくつかのプログラミング言語におけるvoid型は、通常通りに戻るが呼び出し元に結果値を提供しない関数の戻り値の型です。通常、このような関数は、何らかのタスクの実行や出力パラメータへの書き込みなどの副作用のために呼び出されます。このようなコンテキストでの void 型の使用は、PascalのプロシージャやVisual Basicでサブルーチンを定義する構文構造に似ています。また、関数型プログラミング言語や型理論で使用されるユニット型にも似ています。比較については、 ユニット型#プログラミング言語内を参照してください。
C およびC++ は、void 型へのポインタ( として指定)もサポートしていますvoid *が、これは無関係な概念です。この型の変数は、指定されていない型のデータへのポインタであるため、このコンテキストでは (他のコンテキストではそうではありませんが) 、ユニバーサル型またはトップ型のように動作します。プログラムは、任意の型のデータへのポインタ (関数ポインタを除く) を void へのポインタに変換し、情報を失うことなく元の型に戻すことができるため、これらのポインタは多態的関数に役立ちます。C 言語標準では、異なるポインタ型が同じサイズまたはアラインメントを持つことは保証されていません。
void *
CとC++の場合
void 結果型を持つ関数は、関数の終わりに到達するか、戻り値のないreturn 文を実行することによって終了します。void 型は、関数プロトタイプの引数リストを置き換えて、関数が引数を取らないことを示すこともできます。これらのすべての状況において、void はどの値の型修飾子でもないことに注意してください。名前にもかかわらず、これは暗黙のユニット型に意味的に似ており、ゼロ型やボトム型(紛らわしいことに「void 型」と呼ばれることもあります) ではありません。シングルトンである実際のユニット型とは異なり、void 型には値を表す方法がなく、言語は型でオブジェクトを宣言したり値を表す方法を提供していません。
void
C の最も初期のバージョンでは、特定の結果を持たない関数はデフォルトで の戻り値の型になりint、引数を持たない関数は単に空の引数リストを持っていました。型指定のないデータへのポインタは、整数または へのポインタとして宣言されましたchar。初期の Cコンパイラの中には、関数の戻り値を使用しない関数呼び出しに対して警告を生成するという、今では煩わしい機能を持つものがありました。古いコードでは、この警告を抑制するために、このような関数呼び出しを void にキャストすることがありました。Bjarne Stroustrup が1979 年から 1980 年にかけて C++ の研究を始めた頃には、 [要出典] void と void ポインタは、AT&T 由来のコンパイラでサポートされている C 言語方言の一部でした。[1]
関数プロトタイプでvoidを明示的に使用する場合と引数を指定しない場合の意味は、CとC++では次の表に示すように異なります。[2]
上記のような、まだ指定されていない数のパラメータを持つ(非可変)関数を宣言するC構文は、 C99void f()で非推奨になりました。[3] C23 (およびC++)では、空の括弧を持つ関数プロトタイプは、パラメータが0個の関数を宣言します。[4] [5]
Haskellの場合
C++とは全く対照的に、関数型プログラミング言語 Haskellでは、 void型は空の型、つまり、何も存在しない型を表します[1]。void型への関数は結果を返さず、型シグネチャを持つ副作用のあるプログラムは 終了しないか、クラッシュします。特に、void型への全関数IO Void は存在しません。
参照
参考文献
- ^ Ritchie, Dennis M. (1993). 「C 言語の開発」。Association for Computing Machinery, Inc.、著者および Lucent Technologies Inc. 経由。1996 年。1998 年 2 月 20 日時点のオリジナルよりアーカイブ。
- ^ Stroustrup, Bjarne (2009).プログラミング: C++ を使用した原則と実践ボストン: Addison-Wesley. p. 996. ISBN 978-0-321-54372-1。
- ^ Bjarne Stroustrup、「C と C++: 互換性のケーススタディ。相違点の解決方法は? 決定はあなた次第」、Dr. Dobb's、2002 年 9 月 1 日、印刷版
- ^ 「WG14-N2432 : 識別子リストによる関数定義のサポート削除提案」(PDF) . open-std.org . 2019年9月25日。2022年12月27日時点のオリジナルよりアーカイブ(PDF) 。
- ^ “WG14-N2841 : プロトタイプのない関数宣言子はない”. open-std.org . 2021-10-10. 2022年11月12日時点のオリジナルよりアーカイブ。
