微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决声明一个静态函数,但在 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 在文件范围内声明的函数的较早声明可能会被块范围内相同标识符的声明所隐藏。那么先前的声明在该块中将不可见。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。