既存の回答が説明しdouble sort(double)
ているように、関数が存在することをコンパイラに知らせるプロトタイプを提供します。
しかし、これは GCC では機能しないとも言いました。C または C++ プログラムをビルドすると、ソース コードはオブジェクト形式にコンパイルされます。次に、オブジェクト ファイルがリンクされて、実行可能ファイルが形成されます。
これを実際に確認するには、試してください
gcc -c hello.c
これは、ソースファイル hello.c をコンパイル (-c) するように GCC に指示します。hello.c が存在し、エラーがないと仮定すると、現在のディレクトリに hello.o が見つかります。今すぐ試してください
gcc -o hello hello.o
これにより、GCC は hello.o を適切なシステム ライブラリにリンクし、"hello" という出力ファイルを生成するように指示されます。hello.c が数学関数を使用する場合は、数学ライブラリにもリンクする必要があります。
gcc -o hello hello.o -lm
「-l」は、gcc に追加のライブラリ (デフォルトの「libc」C ライブラリ以外) を含めるように指示するために使用されます。"m" は "libm" を指し、これは を含む数学ライブラリですsqrt
。プログラムが 1 つのソース ファイルのみを使用する場合、暗黙的に GCC にコンパイルとリンクを 1 つのコマンドで要求するのが一般的です。
gcc -o hello hello.c -lm
今あなたの質問に。数学ライブラリへのリンクを要求していないため、GCC は上記のコードをコンパイルしません。しかし、g++ はそれで問題ありません。スタック オーバーフローに既に非常によく似た質問があります。その受け入れられた答えによると、
C++ ランタイム libstdc++ は libm を必要とするため、C++ プログラムを GCC (g++) でコンパイルすると、自動的に libm がリンクされます。
「libstdc++」は C++ 言語ランタイム ライブラリであるため、デフォルトで g++ に含まれています。また、libm に依存するため、リンカーは最終的なバイナリ プログラムを生成する際に自動的に libm をロードします。