为什么我可以编译和运行C程序而不需要包含头文件?

3

我已经在 Turbo C++ 3.0、VC++ 2008 express 和 Borland C++ 6 上测试了这个事实。

如果我将一个扩展名为 *.C 的 C 程序添加到项目中,我可以在不包括头文件的情况下编译和运行程序。但是,在这种情况下,一些函数(如 sqrt() 等)会返回错误的值。

如果我将一个扩展名为 *.CPP 的 C++ 程序添加到项目中,则无法在不包括头文件的情况下编译和运行程序。

为什么呢?


4个回答

7
在C语言中,当编译器找不到一个函数的定义时,它会假定该函数是一个返回整数的外部函数。因此代码可以编译通过,如果链接器随后找到了具有相应名称的函数,它也将运行。但是可能会产生意想不到的结果。

4

在C语言中,默认情况下函数的返回类型是int,即使没有声明原型也可以使用例如libc函数。当然,如果它的返回值不是int,则会得到错误的值。
C++更加严格并禁止此操作。
此外,gcc将某些函数实现为内置函数。如果使用了这些函数,可以尝试使用-fno-builtin选项进行编译。


3
如果您不为函数提供声明,C语言会自行猜测。这种猜测几乎总是错误的,因此会导致“错误的值”。而C++则不会这样做。

C猜测它,有任何参考资料吗? - Badr
AFYI 计算机是确定性的机器。 - raj_gt1

2
C++标准要求在使用函数之前必须看到函数原型。
C语言没有这个要求。如果C编译器看到未声明的函数,它会创建一个隐式声明,假定函数返回int类型。如果函数实际上不返回int类型,就会发生不可预知的事情,就像你在sqrt中看到的那样。

最佳答案!谢谢! - aderchox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接