C-当我们将返回类型void分配给int变量的函数调用返回值时会发生什么


#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章,函数调用

如果函数使用与类型不兼容的类型( 表达式)指的是表示所谓函数的表达式,行为是 未定义。

最新更新