【发布时间】: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。但是这些函数不应该在其他其他函数中声明。将在其他函数中声明函数视为过时的特性(以及缺少原型)。