【问题标题】:Declaring a function as extern [duplicate]将函数声明为 extern [重复]
【发布时间】:2018-02-12 22:34:09
【问题描述】:

这样声明函数(bar)有什么区别:

char *foo(char *pch)
{
    extern char *bar(); /* this line here */
    ...
}

还是这样?

char *foo(char *pch)
{
    char *bar(); /* this line here */
    ...
}

【问题讨论】:

  • 没区别,都是有毒的,应该用火来处理。外部函数声明属于头文件,而不是函数内部。
  • 一般情况下,不要在其他函数中声明函数。需要声明的函数(在定义它们的源文件之外可见的所有函数)应该在头文件中声明,使用该函数的代码应该包括头文件——定义函数的代码也应该包含头文件。单个源文件 (static) 的本地函数也应该在文件范围内声明(或定义)(C 不支持嵌套函数,尽管 GCC 做了什么)。
  • @JonathanLeffler 为什么同时为链接和存储类选择关键字static,例如使用intern 进行内部链接会不会更容易混淆?
  • 历史——除了“这就是 DMR 设计它的方式,或者它进化的方式”之外,没有其他解释。您本来可以使用“public”和“private”以及各种其他关键字,但static 被选中并在更改之前就被使用了。
  • 您可能还注意到问题中的声明都不是原型;函数bar 可以使用任意数量的任何类型的参数调用,编译器将接受它们(可能没有抱怨)。如果函数不带参数,请说:extern char *bar(void);extern 是隐含的——函数内的所有函数声明都是隐含的(固有的?)extern。但是这些函数不应该在其他其他函数中声明。将在其他函数中声明函数视为过时的特性(以及缺少原型)。

标签: c extern


【解决方案1】:

2011 C 标准在 6.2.2/5 中说:

如果函数的标识符声明没有存储类说明符,则它的链接将完全确定,就好像它是使用存储类说明符 extern 声明的一样。

所以没有技术上的区别。

但正如 cmets 中已经指出的那样,两者都被认为是糟糕的风格。函数声明不属于另一个将要使用它的函数。如果您使用该模式并想要更改函数的声明,则需要查找并修改所有使用它的地方!应在头文件中声明具有外部链接的函数。具有内部链接的函数(使用 static 关键字)应在源文件开头附近的某处声明。

【讨论】:

  • 有时当您必须在调用多个函数之一之间进行选择时,它会派上用场,而您直到运行时才知道哪一个。例如你有函数叫做shape *create_triangle() shape *create_rectangle()shape *create_circle(),所以可以在函数内部声明一个名为shape * (*create_shape)()的变量,并在运行时根据一些输入将其设置为适当的函数地址。
  • @BiteBytes 这将定义一个函数指针,而不是声明一个函数。
猜你喜欢
  • 2020-10-20
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
相关资源
最近更新 更多