我在Turbo C ++ 3.0,VC ++ 2008 express和Borland C ++ 6上测试过这个事实。
如果我将一个带有* .C扩展名的C程序添加到项目中,我可以编译并运行程序而不包含头文件。但在这种情况下,一些函数(如sqrt()等)会返回错误的值。
如果我将一个带有* .CPP扩展名的C程序添加到项目中,我将无法在不包含头文件的情况下编译和运行该程序。
为什么?
答案 0 :(得分:7)
在C中,当编译器找不到函数的定义时,它假定它是一个返回整数的外部函数。因此代码编译,如果链接器然后找到具有相应名称的函数,它也将运行。但可能有意想不到的结果。
答案 1 :(得分:4)
默认情况下,在C函数中,返回类型是int,即使未声明原型,您也可以使用libc函数。当然,如果它的返回值不是int,那么你就会得到错误的值 C ++更严格,不允许这样做 此外,gcc实现了一些内置函数。如果您使用它,可以尝试使用-fno-builtin选项进行编译。
答案 2 :(得分:3)
如果您没有为函数提供声明,C会猜测它。这种猜测几乎总是错误的,因此你的“错误价值”。 C ++没有这样做。
答案 3 :(得分:2)
C ++标准要求在使用函数之前看到函数原型。
C没有此要求。如果C编译器看到未声明的函数,则会创建一个隐式声明,假设该函数返回int
。如果函数没有真正返回int
,则会发生不可预测的事情,正如您在sqrt
看到的那样。