正如现有答案所解释的那样,double sort(double)
提供了一个原型让编译器知道该函数存在。
但是您还提到这在 GCC 下不起作用。当您构建 C 或 C++ 程序时,源代码将被编译为对象格式。然后将目标文件链接在一起以形成可执行文件。
要查看此操作,请尝试
gcc -c hello.c
这告诉 GCC 编译 (-c) 源文件 hello.c。假设 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
. 如果您的程序仅使用一个源文件,通常会隐式要求 GCC 在一个命令中进行编译和链接:
gcc -o hello hello.c -lm
现在回答你的问题。GCC 不会编译上面的代码,因为你没有要求它链接到数学库中。但是 g++ 没问题。Stack Overflow 上已经有一个非常相似的问题。根据其接受的答案,
C++ 运行时 libstdc++ 需要 libm,因此如果您使用 GCC (g++) 编译 C++ 程序,您将自动获取 libm 链接。
由于 "libstdc++" 是 C++ 语言运行时库,因此它默认包含在 g++ 中。由于它依赖于 libm,因此链接器会在生成最终二进制程序时自动加载 libm。