没有在C中指定返回类型的函数

没有在C中指定返回类型的函数,c,function-declaration,C,Function Declaration,我在C语言中遇到了这段代码: #include <stdio.h> main( ) { int i = 5; workover(i); printf("%d",i); } workover(i) int i; { i = i*i; return(i); } #包括 主要() { int i=5; 修井(一); printf(“%d”,i); } 修井(一) int i; { i=i*i; 回报(i); } 我想知道函数“workover”的声明如何有效?当我们不提及函数

我在C语言中遇到了这段代码:

#include <stdio.h>
main( )
{
 int i = 5;
 workover(i);
 printf("%d",i);
}
workover(i)
int i;
{
 i = i*i;
 return(i);
}
#包括
主要()
{
int i=5;
修井(一);
printf(“%d”,i);
}
修井(一)
int i;
{
i=i*i;
回报(i);
}

我想知道函数“workover”的声明如何有效?当我们不提及函数的返回类型时会发生什么?(我们可以返回什么吗?)。参数也只是一个变量名,这是如何工作的

如果不指定返回类型或参数类型,C将隐式声明它为
int

这是早期版本C(C89和C90)的一个“特性”,但现在通常被认为是不好的做法。由于C99标准(1999)不再允许此操作,因此针对C99或更高版本的编译器可能会向您发出类似于以下内容的警告:

program.c: At top level:
program.c:8:1: warning: return type defaults to ‘int’
 workover(i)
 ^

函数声明语法在较旧版本的C中使用,并且仍然有效,因此代码片段“workover(i)inti;”相当于“workover(inti)”。尽管如此,我认为它仍然可能会生成警告甚至错误,这取决于您使用的编译器选项。

当我将您的代码编译为
$gcc common.c-o common.exe-Wall
(在Cygwin终端上尝试,因为我现在没有带linux系统)

我收到以下警告:

common.c:3:1: warning: return type defaults to ‘int’ [-Wreturn-type]
main( )
^
common.c: In function ‘main’:
common.c:6:2: warning: implicit declaration of function ‘workover’ [-Wimplicit-f                  unction-declaration]
workover(i);
^
common.c: At top level:
common.c:9:1: warning: return type defaults to ‘int’ [-Wreturn-type]
workover(i)
^
common.c: In function ‘main’:
common.c:8:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
  • 第一个和第三个表示,
    返回类型默认为“int”
    ,这意味着如果不指定返回类型,编译器将隐式声明它为
    int
  • 第二个说,
    函数“workover”的隐式声明
    ,因为编译器不知道什么是
    workover
  • 第三个警告很容易理解,如果您修复了第一个警告,它就会消失
  • 你应该这样做:

    #include <stdio.h>
    
    int workover(int);
    
    int i;
    
    int main(void)
    {
        int i = 5;
        workover(i);
        printf("%d",i);     //prints 5
        return 0;
    }
    
    int workover(int i)
    {
        i = i*i;    //i will have local scope, so after this execution i will be 25;
        return(i);  //returns 25
    }
    
    #包括
    国际修井(国际);
    int i;
    内部主(空)
    {
    int i=5;
    修井(一);
    printf(“%d”,i);//打印5
    返回0;
    }
    国际修井(国际一级)
    {
    i=i*i;//我将具有局部作用域,因此执行此操作后,我将为25;
    return(i);//返回25
    }
    
    它仍然无效:“这就是可能生成警告的原因。这两个警告并不完全相同<代码>修井(i)int i不是原型,但
    修井(int i)
    是原型。它类似于
    intmain()
    intmain(void)