【发布时间】:2018-11-21 09:05:28
【问题描述】:
我在this post 中阅读了如何在 C 中为函数使用 static 说明符,但我不明白是否有必要在函数的原型和定义中都使用它,或者可以在定义中省略它。例如,在这种情况下:
static void foo(void);
void foo() {...}
foo 只有一个内部链接还是这样的用法不正确?
【问题讨论】:
我在this post 中阅读了如何在 C 中为函数使用 static 说明符,但我不明白是否有必要在函数的原型和定义中都使用它,或者可以在定义中省略它。例如,在这种情况下:
static void foo(void);
void foo() {...}
foo 只有一个内部链接还是这样的用法不正确?
【问题讨论】:
foo 只有一个内部链接还是这样的用法不正确?
6.2.2 Linkage of identifier 状态:
对于使用存储类说明符 extern 声明的标识符,在该标识符的先前声明可见的范围内,31) 如果先前的声明指定内部或外部链接,则后面声明的标识符的链接是与先前声明中指定的链接相同。
当foo 定义说它具有外部链接时(如果没有明确指定,则函数具有外部链接1)并且在那时,有一个带有内部链接的foo 的先前声明是可见的。所以foo 有内部链接。
1:
如果函数标识符的声明没有存储类说明符,则其链接的确定与使用存储类说明符 extern 声明时完全相同。如果对象标识符的声明具有文件范围且没有存储类说明符,则其链接是外部的。
【讨论】:
在 C 中,整个函数都有默认的外部链接。如果对函数使用 static 关键字。它将链接从外部链接变为内部链接。您可以使用“静态”关键字使该函数仅可用于其中定义的文件。仅此而已。
static void foo(void); // internal linkage
void foo(void); // external linkage
【讨论】:
您的使用完全没问题。 foo 仅在当前正在编译的源文件中是已知的。
【讨论】: