0
#include<stdio.h>
int main(){
 int ret;
 printf("\n main() is called! \n");
 ret = func(1,2);
 printf("\n The ret value is : %d \n",ret);
 return 0;
}
int func(int x,int y){
  printf("\n func() is called! x: %d , y : %d \n",x,y);
  if(x == 1){
    return y+x;
  }
  else{
    return y-x;
  }
}

该程序在 main() 中没有函数声明。该程序没有给出任何编译错误。为什么 ?

4

3 回答 3

3

在过去的 C 语言中,这有点常见,它被称为隐式声明。这个想法是编译器在第一次使用时自动为你的函数生成一个原型,使用你碰巧使用的参数类型,并返回int.

是的,这听起来很糟糕……这就是现代编译器会为此代码发出警告的原因。如果您使用gcc尝试编译-Wall来查看通常的警告。

PS:这就是为什么NULL定义为((void*)0)而不是简单的原因之一0,这样自动原型设计的功能foo(NULL)就会得到一个int foo(void*)而不是int foo(int)

于 2013-06-06T10:20:52.413 回答
2

因为你的函数的返回类型是int. 当您有一个尚未声明的函数调用时,返回类型默认为intC 语言。在您的情况下,调用 func(1,2);, 默认为int,而后面定义的函数也是 , int。这就是为什么没有冲突。

当您将返回类型更改为 以外的任何内容int时,您将收到错误消息。

例如下面的代码给出conflicting-types错误,因为。函数调用隐式声明了一个int返回函数,后来原始函数定义具有类型float

此代码给出了错误:

#include<stdio.h>
int main(){
 float ret;
 printf("\n main() is called! \n");
 ret = func(1,2);
 printf("\n The ret value is : %f \n",ret);
 return 0;
}
float func(int x,int y){
  printf("\n func() is called! x: %d , y : %d \n",x,y);
  if(x == 1){
    return x+y;
  }
  else{
    return y-x;
  }
}

编辑:

在 C 语言中,在编译器的早期阶段,首先当看到函数调用时,它们被隐式声明,然后在后期阶段搜索定义。因此,当搜索失败时,它会给出未定义的函数错误,但不会给出未声明的函数。但是当定义存在但类型冲突时,会给出冲突类型错误......但在您的情况下,默认声明和原始声明是相同的,这就是您没有收到任何错误的原因。

您还必须注意,如果函数在未看到声明后立即定义,则无需立即中止编译。首先,它只是标记implicit声明,如果根本没有定义,则代码中的任何位置都没有。然后它抛出undefined function error.

于 2013-06-06T10:21:33.963 回答
1

编译器不会抛出任何错误..它只是给出一个警告

implicit declaration of function

如果你用-Wallin编译代码gcc

于 2013-06-06T10:26:46.647 回答