【问题标题】:Declare a static function but implement it without the 'static' keyword in C?声明一个静态函数,但在 C 中不使用“static”关键字来实现它?
【发布时间】:2021-06-21 03:10:09
【问题描述】:

是否可以使用 static 关键字编写函数的 forward declaration 但稍后在不使用 static 关键字的文件中实现它?

例如:

#include <stdio.h> /* printf */

static void func();

int main()
{
    func();

    return(0);
}

void func()
{
    printf("Hello World");
}

它编译和运行没有任何错误,但 func 是否是 static 函数?为什么?

【问题讨论】:

  • 它是静态的,因为你已经这样声明了。
  • 这样写可以吗?用特定关键字声明函数,然后在没有它的情况下实现它?被接受了吗?
  • 前向声明应该是static void func(void);,因为函数没有参数。

标签: c static declaration implementation forward-declaration


【解决方案1】:

C 2018 6.2.2 5 表示没有存储类说明符的函数声明(例如externstatic)与使用extern 相同:

如果函数标识符的声明没有存储类说明符,则其链接被确定为就好像它是使用存储类说明符extern...

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

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

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

脚注

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2011-06-08
    • 2012-06-04
    • 2021-12-30
    • 2014-10-08
    相关资源
    最近更新 更多