声明一个静态函数,但在 C 中不使用“static”关键字来实现它?

问题描述

使用 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 说没有存储类说明符(例如 externstatic)的函数声明与使用 extern 相同:

如果函数的标识符声明没有存储类说明符,则其链接的确定与使用存储类说明符 extern...

C 2018 6.2.2 4 表示在带有 extern 的声明之后的带有 static 的声明是可见的1 使用由 static 建立的内部链接:

对于在该标识符的先前声明可见的范围内使用存储类说明符 extern 声明的标识符,如果先前声明指定了内部或外部链接,则后面的标识符的链接声明与先前声明中指定的链接相同。

因此行为被定义为使用内部链接,我相当确信 C 标准中没有任何内容可以覆盖这一点。

脚注

1 在文件范围内声明的函数的较早声明可能会被块范围内相同标识符的声明所隐藏。那么先前的声明在该块中将不可见。