2017-12-01 50 views
-2

MacBook Pro 2017を持っていて、 "void main"と書かれたプログラムをコンパイルするとコンパイラはmainの戻り値の型がわからないという警告を出します"mainの戻り値の型はintではありません" macOSの警告

void main(){ 

(...) 

} 
+2

mainの戻り値の型をintに変更します。 'int main(){' – Steve

+0

'main'は' int'(ホストされた環境では、とにかく)を返すようになっています。はい、あなたは、Web上やいくつかの本(いくつかの良いものを含む)の中で 'void main()'の無数の例を見ることができます - 厳密に言えば、すべて誤りです。間違った戻り値の型を使うと*未定義の動作*が発生し、コンパイラは未定義の動作のために診断を発行する必要はありません。しかし、それほど一般的なエラーであるため、現在はもっと多くの人がそうしています。 –

答えて

3

警告のようにintが...あなたがintとして戻り値の型を定義する必要があり、こう述べています。

int main() { 
    // bunch of code... 

    return 0; 
} 
0

main()int値を返すことが期待されます。最小限のスタートは、次のとおりです。

int main() { 
    return 0; 
} 

コマンドラインパラメータを受け入れるより正式版:

int main(int argc, char** argv) { 
    return 0; 
} 

異なるタイプでそれを宣言するが、それは互換性がないことができます。古いコンパイラの中には気にしないものもあれば、Xcodeのものもあります。

Cは長年にわたり、初期の段階からかなり進化しています。古いリファレンスを使用している場合は、実際には奇妙な表記法や、もはや価値のない表記法がある例があります。

3

現在のバージョンのC標準では、main関数の戻りタイプがintであることが必要です。したがって、定義をint main()に変更して値を返す必要があります。 C standard詳述ホスト環境の

セクション5.1.2.2.1には、次のように述べている:

プログラムの起動時に呼び出される関数がmainという名前です。実装はこの関数のプロトタイプを宣言しません。 それはintの戻り型とし、パラメータなしで を定義しなければならない:

int main(void) { /* ... */ } 

又は二つのパラメータ(argcargvとしてここで呼ばれる、と彼らはローカルであるような任意の 名が、使用されてもよいです

int main(int argc, char *argv[]) { /* ... */ } 

または同等のまたはいくつかの他の実装定義のように:それらは を宣言された関数)へ。

空のパラメータリストは、パラメータがないため、int main()という定義が可能です。セクション6.7.6.3から:

識別子リストは、関数のパラメータの唯一の識別子を宣言します。 ファンクション宣言子 の空のリストは、そのファンクションの定義の一部であり、 ファンクションにパラメータがないことを指定します。ファンクション宣言子 の空のリストは、そのファンクションの定義に含まれていないため、パラメータの数またはタイプについての情報が提供されていないことを示します。void main()などの主要機能を指定

はK & Rの日から事前に標準化された変異体であり、もはや有効ではありません。

+0

なぜ 'int main()'が 'int main(void)'の正当な代用者なのかについてのコメントはありますか? –

+0

@DavidBowling Done。 – dbush

+0

Hmmm。私はこれを考えていた:["その関数の定義の一部である関数宣言子の空リストは、その関数にパラメータがないことを指定する"](http://port70.net/~nsz/c/c11/ n1570.html#6.7.6.3p14)。これはここには当てはまりませんか? –

関連する問題