【问题标题】:C - Mismatched function prototype and definition for "static" functionC - “静态”函数的函数原型和定义不匹配
【发布时间】:2014-03-10 18:10:48
【问题描述】:

我试图找到一些关于 C 函数理论的官方确认。在我的一个简单项目中,我有一个函数,我只想在定义它的.c 文件中可见。函数原型为:

static int sum(int a, int b);

函数定义为:

int sum(int a, int b) {
   return (a+b);
}

根据构建输出、链接映射等分析,该函数似乎确实是静态的。我很惊讶我也没有收到任何构建警告或错误。但是,是否有任何文档(即:GCC 手册中的特定行)可以确认这种行为,或者预期什么?

我找到了与 C++ (Static keyword in function declaration can be missing in function definition?) 相同的问题,但我正在寻找关于纯 C 的答案。

谢谢。

【问题讨论】:

  • 我认为 C++ 只是从 C 继承了这个特性。
  • 我不明白您为什么会收到错误或警告。您的原型和函数是否定义在不同的文件中?
  • @mbratch 他认为原型和定义在使用static修饰符时需要保持一致。
  • @JoachimPileborg 我将它们都设为静态,并且在上述情况下,在它们都被定义为静态的情况下,没有遇到错误并且导致相同的行为。如果它们都没有被定义为静态,我期待一个错误。

标签: c gcc function-prototypes


【解决方案1】:

你可以从http://www.iso.org/iso/home/store/catalogue_ics/catalogue_detail_ics.htm?csnumber=57853下载完整的规范

只需 238 瑞士法郎,我相信一定会有答案。否则,我所拥有的最佳资料来自 K&R 的“The C Programming Language”第 2 版,第 83 页的第 4.6 节(已添加重点)

“外部静态声明最常用于变量,但它也可以应用于函数。通常,函数名称是全局的,对整个程序的任何部分都是可见的。如果函数声明是静态的,但是,它的名称在声明的文件之外是不可见的。”

请注意,引号仅指函数的声明,而不是其定义,尽管静态函数的常见做法是定义也用作声明。

【讨论】:

  • n1570.pdf 是免费提供的 2011 ISO C 标准草案;在该草案和发布的标准之间只进行了一些小的调整。如果你想要一份官方标准的副本,至少如果你在美国,你可以从ANSI 以 60.00 美元的价格买到它(嗯,我买的时候是 30 美元)。
  • 那里有一点点通货膨胀,但与 270 美元相比仍然很便宜:)
【解决方案2】:

默认情况下,该函数仅在.c 中可见,为了使其对其他文件可见,您必须在标头(.h 文件)中声明其原型。

这里不要把 static 想成 Java 或其他只有类才能调用静态方法的 OO 语言,这是相当不同的。

C中static的行为是一个函数或变量只在当前编译的范围内是已知的,数据保存在生成​​的可执行文件中。

【讨论】:

  • 例如,我确实理解在 C 和 Java 中使用 static 的区别。让我困惑的是原型和定义之间的差异。
  • 好吧...把它想象成变量,你会使用 static int var1; 但要使用它,你只需在原型中调用它 var1, static将告诉编译器如何初始化函数、编译或运行时
  • 这部分是有道理的,但比较并不完全是一对一的。在函数定义的开头,我们必须重新键入相同的函数名、返回类型和参数列表。唯一似乎不同的是存储类修饰符。在您描述的示例中,数据类型仅使用一次。
  • 嗯,你其实不必在C文件中写原型,你可以简单地写函数static int sum(int a,int b ){//implementation}C 文件中没有任何其他内容并在其中使用它,为了您的使用,不这样做是有意义的,但通常是将所有原型保存在一个.h 这样您就可以跟踪每个声明的方式
猜你喜欢
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 2011-06-19
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
相关资源
最近更新 更多