代码之家  ›  专栏  ›  技术社区  ›  fearless_fool

在声明int foo(void)之后定义int foo(){}`vs`int foo(void){}``

  •  4
  • fearless_fool  · 技术社区  · 5 年前

    注意:这与 func() vs func(void) in c99 ,因为这里的问题是关于 在一个有效的 宣言

    应该 实施 零参数的 void 关键字?具体来说,C标准对以下两个函数的实现有什么要说的吗?请注意,两者 foo1 foo2 声明为零参数函数 ;唯一的区别在于执行,而不是宣言:

    #include <stdio.h>
    
    int foo1(void);  // inform compiler that foo1 and foo2 are zero-args fns.
    int foo2(void);
    
    int main() {
      printf("%d\n", foo1());
      printf("%d\n", foo2());
      return 0;
    }
    
    int foo1(void) { return 22; }
    int foo2() { return 22; }
    

    gcc -Wall -std=c99 -Wpedantic foo.c -o foo 编译和执行时没有任何警告或错误,但是否违反了标准?

    1 回复  |  直到 5 年前
        1
  •  3
  •   M.M    5 年前

    您发布的代码是正确的。 int foo2(void); 声明 foo2

    对于两个要兼容的函数类型,两者都应指定兼容的返回类型。此外,参数类型列表(如果两者都存在)应在参数数量和省略号终止符的使用上保持一致;相应的参数应具有兼容的类型。如果一个类型具有参数类型列表,而另一个类型由不属于函数定义一部分且包含空标识符列表的函数声明符指定,参数列表不应有省略号终止符,每个参数的类型应与应用默认参数所产生的类型兼容。 如果一种类型具有参数类型列表,而另一种类型由包含(可能为空)标识符列表的函数定义指定,则两者的参数数量应一致 升级到对应标识符的类型。(在确定类型兼容性和复合类型时,使用函数或数组类型声明的每个参数被视为具有调整的类型,使用限定类型声明的每个参数被视为具有其声明类型的非限定版本。)

    在这一点上有这么多文本的原因是C最初只有K&R样式的函数,然后添加了原型。因此,必须有文本来涵盖K&R风格与原型风格的所有可能组合。以粗体部分开头的部分指的是使用K&R样式的函数定义,前提是该函数以前已经用原型声明过。


    过时的

    某些功能已过时,这意味着它们可能会被考虑用于