#include<stdio.h>
int main()
{
//void foo();
int c= 5;
c=foo();
printf("n%d",c);
return 0;
}
void foo()
{
printf("I am foo");
}
当我评论原型声明时,它给出了输出:
我是foo
8
使用原型给出了错误的说法:
void值不应该应忽略。
我的问题是,当没有原型声明时,内部发生了什么?它背后的原因是什么?
我正在使用TDM-GCC 4.9.2 64位编译器。
成功构建的唯一原因是隐式int规则(现在在C标准的最新修订中删除)。
编译器认为foo
的正向声明没有,因此假设其返回类型为int。然后,它继续构建并调用您的void foo()
。毕竟说并完成了,您的程序的行为是不确定的。
gcc编译器发出警告并成功运行, whitespace 返回字符,但有些编译器会出现错误。
pp.c:10:6: warning: conflicting types for ‘foo’ [enabled by default]
void foo()
^
pp.c:6:6: note: previous implicit declaration of ‘foo’ was here
c=foo();
没有原型声明
好吧,这是无效的c。
详细说明,
-
点1:您无法具有未较早声明的函数。它违反了C标准规则。注意
-
点2:一旦添加前向声明,您就会遇到编译错误,因为
void
类型不能是分配运算符的RHS操作数,这是一个分配运营商的约束违规。
注意:
pre c99,允许在没有原型的情况下调用一个函数,假定该函数将返回int
,并将接受任何数量的参数。但是,由于"隐式int规则"已从标准中删除,因此完全禁止这是根据C99的规定。(请参阅第5段,_" remove IntriT Int" _在C99
标准中)。
在您的情况下,出于遗产原因,编译器仍然支持隐式int规则,因此它可以予以核对,但是,编译器的假设和实际函数定义是不匹配的。这调用了未定义的行为。
引用C11
,第§6.5.2.2章,函数调用
如果函数使用与类型不兼容的类型( 表达式)指的是表示所谓函数的表达式,行为是 未定义。