如何使用任何参数类型的函数声明?

时间:2010-03-28 18:11:57

标签: c methods declaration

我忘了编写void参数,但它的工作原理是我把它给出了错误 它让我们:

print(int size,int table[size][size]){
  int i,j;
  printf("-------TABLE-------\n");
  for(i = 0;i<size;i++){
    for(j = 0;j<size;j++){
       if(table[i][j]==EMPTY)
        printf(". ");
       else
        printf("* ");
    }
    printf("\n");
  }
}

它说“previos隐式声明在这里”(意味着主要的呼叫)

void print(int size,int table[size][size]){
  int i,j;
  printf("-------TABLE-------\n");
  for(i = 0;i<size;i++){
    for(j = 0;j<size;j++){
       if(table[i][j]==EMPTY)
        printf(". ");
       else
        printf("* ");
    }
    printf("\n");
  }
}

4 个答案:

答案 0 :(得分:1)

如果声明一个功能

foo(int x) {
}

编译器会将返回类型推断为int,就好像您已编写

一样
int foo(int x) {
}

但是,真的,这是你遇到的最少的问题。

E. Huss的 The C Library Reference Guide 的参考:§1.3.1

答案 1 :(得分:0)

没有void,例如,function()表示函数声明可能有任何参数 function(void)表示它没有。

答案 2 :(得分:0)

这是一件历史文物。这是为了向后兼容旧的C代码(从C标准化之前)。假定没有显式返回类型的函数返回int,如果没有指定显式参数,则假定它采用一些未指定数量的参数。

答案 3 :(得分:0)

在C中,与C ++相反,假设您没有在编译器中使用严格的C99一致性模式,那么当编译器遇到类似于函数调用的东西但标识符之前未被声明时,则编译器假定它是返回整数的函数的名称。

int main(void)
{
     something_functional(1, 2);
}

如果没有原型,C90或宽松C99模式下的编译器会假设'something_functional()'确实是一个返回整数的函数。

如果您随后写道:

something_functional(double d, char *s)
{
    ...
}

编译器将假设'something_functional()'的返回类型是int并且将允许代码编译(尽管调用中的实际参数类型与函数定义之间存在可怕的不匹配)。

如果您随后写道:

void something_functional(douebl d, char *s)
{
    ...
}

编译器会非常正确地抱怨你已经告诉它有关函数的不同内容并且这会使它错误。

有几种方法可以解决问题:

  1. 在函数调用之前移动函数定义。这就是Pascal所需要的,并导致main()函数出现在文件的底部。
  2. 将该函数的原型放在文件中使用之前:

    static void something_functional(double d,char * s);

  3. 我认为如果不从源文件外部调用该函数,它应该是静态的。

    请注意,严格一致模式下的C99不允许隐式声明函数。 C ++从来没有。

    前C99还有另一个有趣的功能。你也可以写:

    static c;
    static function();
    
    some_function(a, b)
    {
    }
    

    这定义了一个整数变量c,一个名为function()的函数返回int,一个名为some_function()的函数定义了两个int个参数,返回int

    在严格的C99代码中不允许这样做 - 并且在C90代码中不是特别好的样式,但允许向后兼容预标准C。