声明一个静态函数但在 C 中不使用 'static' 关键字实现它?
Declare a static function but implement it without the 'static' keyword in C?
是否可以使用 static
关键字编写函数的 forward declaration
但稍后在没有 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 表示没有存储-class 说明符(例如extern
或static
)的函数声明与使用extern
相同:
If the declaration of an identifier for a function has no storage-class specifier, its linkage is determined exactly as if it were declared with the storage-class specifier extern
…
C 2018 6.2.2 4 表示在带有 static
的声明之后带有 extern
的声明可见 1 使用由static
:
For an identifier declared with the storage-class specifier extern
in a scope in which a prior declaration of that identifier is visible, if the prior declaration specifies internal or external linkage, the linkage of the identifier at the later declaration is the same as the linkage specified at the prior declaration.
所以行为被定义为使用内部链接,我相当有信心在 C 标准中没有任何东西可以覆盖它。
脚注
1 在文件范围内声明的函数的较早声明可以被块范围内相同标识符的声明隐藏。那么之前的声明在该块中将不可见。
是否可以使用 static
关键字编写函数的 forward declaration
但稍后在没有 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 表示没有存储-class 说明符(例如extern
或static
)的函数声明与使用extern
相同:
If the declaration of an identifier for a function has no storage-class specifier, its linkage is determined exactly as if it were declared with the storage-class specifier
extern
…
C 2018 6.2.2 4 表示在带有 static
的声明之后带有 extern
的声明可见 1 使用由static
:
For an identifier declared with the storage-class specifier
extern
in a scope in which a prior declaration of that identifier is visible, if the prior declaration specifies internal or external linkage, the linkage of the identifier at the later declaration is the same as the linkage specified at the prior declaration.
所以行为被定义为使用内部链接,我相当有信心在 C 标准中没有任何东西可以覆盖它。
脚注
1 在文件范围内声明的函数的较早声明可以被块范围内相同标识符的声明隐藏。那么之前的声明在该块中将不可见。