ボイドとは?voidの適切な使用例を教えてください。void main (void)
また、 orと書くときの違いは何main()
ですか?
5 に答える
Cでは、一般に、(void)
関数呼び出しに引数が不要であることを()
意味し、不特定の数の引数を意味します。
例えば
void foo(void)
{
// body
}
void bar()
{
//body
}
通話環境では、
foo(); // Correct
foo(1); // Incorrect
bar(); // Correct
bar(1); // Also correct
以上が一般的な説明でした。
しかし、 main() の場合、C99 Standard は次のように述べています。
5.1.2.2.1 プログラムの起動
プログラムの起動時に呼び出される関数は main と呼ばれます。実装は、この関数のプロトタイプを宣言していません。これは、戻り値の型が int で、パラメーターなしで定義されます。
int main(void) { /* ... */ }
また
2 つのパラメーター (ここでは argc および argv と呼ばれますが、宣言されている関数に対してローカルであるため、任意の名前を使用できます):
int main(int argc, char *argv[]) { /* ... */ }
または同等のもの。
また
他の実装定義の方法で。
したがって、このvoid main(void)
戻り値の型は である必要がありますint
。
そして最後に、 formain()
には戻り値の型が指定されていないため、暗黙的に戻り値の型は になりますint
。
次のようにメインの戻り値の型を除外します
main(){
}
それが型であることを意味するのではなくvoid
、コンパイラに依存します。一般的には次のように解釈されていると言えると思います。
int main(){
}
void
タイプはコンパイラに「エンティティ」(「ストレージ」なし)がないことを伝えます。
void func(int i)
int を取りますが、何も返しません。パラメータの場合、これは次のとおりです。
void func()
これと同等です:
void func(void)
これは、パラメーターを取らないことをより明示的に示しています。別の話は、型void *
である型、無次元のものへのポインターです。
基本的にvoidはデータ型であり、基本的にメソッド宣言で使用されます。それは何も意味しないか、タイプがないことを意味します。例えば:
1) int myFunc(void)
-- 関数は何も取りません。
2) void myFunc(int)
-- 関数は何も返さない
3) void* data;
-- 'data' は不明な型のデータへのポインタであり、逆参照できません
ボイドは「空」を意味します。void main()の例では、関数main()が値を返さないことを意味します。void main()は絶対に避けてください(しゃれは意図していません)。代わりにint main()を使用してください。int main()は、プログラムが終了時にint型の値をOSに返すことができることを確認します。voidには他にも多くの用途があります。これについて詳しく知りたい場合は、このWebサイトをチェックしてください。
void
値のないデータ型です。また、完成できない不完全なデータ型でもあります。関数の戻り値の型として使用すると、関数が値を返さないことを示します。
void foo(int x);
パラメーター リストとして使用すると、関数が引数を取らないことを示します。
void bar(void);
これは、関数が指定されていない数の引数を取ることを示す空のパラメーター リストとは異なります (C では、C++ では、空のパラメーター リストは を使用するのと同じですvoid
)。
void bletch();
オブジェクト (変数) を入力できませんvoid
。ただし、型のポインターを宣言することはできますvoid *
。これらは「ジェネリック」ポインターであり、明示的なキャストなしで他のポインター型との間で変換できます。標準のメモリ割り当て関数malloc
、calloc
、およびrealloc
すべての戻り値は次のvoid *
とおりです。
double *darr = malloc(sizeof *darr * rows);
ホストされた実装 (基本的に、オペレーティング システムを使用するもの) では、次のmain
ように宣言する必要があります。
int main(void)
また
int main(int argc, char **argv) // the parameter names can be whatever you want,
// but argc and argv are the usual convention;
// char **argv is equivalent to char *argv[]
または他の実装定義の方法で。実装は受け入れることができます
void main()
の正当な署名としてmain
、しかし、どこかにそれを明示的に文書化する必要があります。