为什么'extern'声明不适用于C中的静态函数?

4 c static extern

假设代码:

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语言.