假设代码:
extern int foo(void);
static int foo(void)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
尝试使用GCC进行编译
$ gcc -Wall -std=c99 1.c
1.c:3:12: error: static declaration of ‘foo’ follows non-static declaration
1.c:1:12: note: previous declaration of ‘foo’ was here
1.c:3:12: warning: ‘foo’ defined but not used [-Wunused-function]
Run Code Online (Sandbox Code Playgroud)
那么,我该如何声明静态函数呢?
Alo*_*ave 19
为什么声明
extern不适用于static函数?
因为extern指示外部链接而static指示内部链接.显然,你不能同时拥有两个功能.
简单来说,当您使用static该函数时,您告诉编译器请将此函数的范围仅限于此转换单元,并且不允许任何人从另一个转换单元访问此函数.
虽然函数声明是extern默认情况下,但是当您extern明确指定时,告诉编译器,请允许其他翻译单元的每个人访问此函数.
很明显,编译器不能同时做到这两点.
因此,无论您是希望功能仅在翻译单元中可见,还要做出选择.
如果前者成功static而忘记extern.如果后者只是放弃了static.
好读:
什么是外部联系和内部联系?
虽然上面的Q代表C++,但讨论的大多数内容也适用于C语言.