Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++におけるint main()とint main(void)の違い


C言語およびC++において、main関数はプログラムの実行開始点となる特別な関数です。その宣言には「int main()」と「int main(void)」という2つの形式がありますが、これらの扱いはCとC++で異なります。本記事では、両者の違いをサンプルコードと出力例をもとに詳しく解説します。

C言語の場合

C言語では、関数の宣言時にパラメータが指定されていない場合、その関数は任意の個数の引数を受け取ることができます。しかし、C++では同じことが当てはまらず、引数を渡すとコンパイルエラーになります。このため、C言語ではint main()とint main(void)はほぼ同じ意味を持ちますが、main関数への引数の受け渡しを明確に制限できるという点で、int main(void)と記述する方がより良い作法とされています。

サンプルコード(C)

#include <stdio.h>
int main() {
    static int counter = 3;
    if (--counter){
        printf("%d ", counter);
        main(5);
    }
}

出力結果

2 1

上記のCのコードでは、引数なしで宣言されたmain関数に対してmain(5)と引数を渡してもコンパイルが通り、正常に実行されます。

サンプルコード(C++)

#include <iostream>
using namespace std;
int main() {
    static int counter = 3;
    if (--counter){
        cout << counter;
        main(5);
    }
}

出力結果

main.cpp: In function 'int main()':
main.cpp:10:13: error: too many arguments to function 'int main()'
  main(5);
          ^
main.cpp:5:5: note: declared here
int main()
    ^~~~

一方、C++では引数なしで宣言されたmain関数に引数を渡すと、「too many arguments to function 'int main()'」というコンパイルエラーが発生します。

まとめ

C言語では、空の括弧「()」は「引数の指定なし(ただし任意の引数を受け付ける可能性がある)」という曖昧な意味を持ちます。そのため、int main()とint main(void)は事実上同じように動作します。一方、C++では「()」も「(void)」もどちらも「引数なし」を明確に意味するため、両者は完全に等価です。とはいえ、C言語でも意図を明確に示すためにint main(void)と記述することが推奨されます。なお、C++の規格ではmain関数の再帰呼び出しは認められていないため、実際の開発では注意が必要です。

  1. 【C/C++】const int* と int* const の違いを徹底解説!宣言の読み方のコツも紹介

    はじめに:constとポインタの組み合わせ C/C++では、「const」と「ポインタ」を組み合わせた宣言が複数存在し、それぞれ意味が異なるため、初心者がつまずきやすいポイントの一つです。この記事では、代表的な4つのパターンを整理し、何が変更できて何が変更できないのかを具体例とともに解説します。 4つの基本パターン int* // intへのポインタ int const * // constなintへのポインタ int * const // intへのconstポインタ int const * const // con

  2. C++における「宣言」と「定義」の違いとは?具体例でわかりやすく解説

    C++を学んでいると、「宣言(declaration)」と「定義(definition)」という2つの用語が頻繁に登場します。この2つはよく混同されがちですが、実際には明確な違いがあります。本記事では、その違いを具体例とともにわかりやすく解説します。 宣言(Declaration)とは? 宣言とは、プログラム内で使用する変数、ユーザー定義型、関数について、その型やサイズ(関数の場合は戻り値の型や引数の型・数)をコンパイラに事前に伝えることです。 重要なポイントは、宣言の段階ではメモリ上に領域が確保されないという点です。コンパイラに対して「この名前の変数や関数が後で登場しますよ」と知らせるだけの