问题描述
使用 forward declaration
关键字编写函数的 static
但稍后在没有 static
关键字的文件中实现它是否可以?
例如:
#include <stdio.h> /* printf */
static void func();
int main()
{
func();
return(0);
}
void func()
{
printf("Hello World");
}
它编译和运行时没有任何错误,但 func
是否是 static
函数,为什么?
解决方法
C 2018 6.2.2 5 说没有存储类说明符(例如 extern
或 static
)的函数声明与使用 extern
相同:
如果函数的标识符声明没有存储类说明符,则其链接的确定与使用存储类说明符 extern
...
C 2018 6.2.2 4 表示在带有 extern
的声明之后的带有 static
的声明是可见的1 使用由 static
建立的内部链接:
对于在该标识符的先前声明可见的范围内使用存储类说明符 extern
声明的标识符,如果先前声明指定了内部或外部链接,则后面的标识符的链接声明与先前声明中指定的链接相同。
因此行为被定义为使用内部链接,我相当确信 C 标准中没有任何内容可以覆盖这一点。
脚注
1 在文件范围内声明的函数的较早声明可能会被块范围内相同标识符的声明所隐藏。那么先前的声明在该块中将不可见。