假设代码:
extern int foo(void);
static int foo(void)
{
return 0;
}
尝试使用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]
那么,我怎样才能声明静态函数?
答案 0 :(得分:19)
为什么
extern
声明不适用于static
个功能?
由于extern
表示外部链接,而static
表示内部链接。显然,你不能同时拥有两个功能。
简单来说,当您在函数上使用static
时,请告诉编译器请将此函数的范围仅限于此 translation unit ,并且不允许任何人从另一个翻译单元访问此
默认情况下,函数声明为extern
,当您明确指定extern
时,告诉编译器,请允许其他翻译单元的所有人访问此函数。
很明显,编译器不能同时做到这两点。
因此,请选择是否要让该功能仅在翻译单元中可见
如果前者成为static
而忘记extern
。如果后者只丢下static
。
好读:
What is external linkage and internal linkage?
虽然上面的Q代表C ++,但讨论的大部分内容也适用于C.
答案 1 :(得分:3)
您使用static
static int foo(void);
static int foo(void)
{
return 0;
}
答案 2 :(得分:1)
extern
表示该函数在不同的翻译单元(文件)中定义。 static
表示它仅用于定义它的翻译单元。这两者是相互排斥的。
答案 3 :(得分:-1)
是不是静态可以通过外部(al)链接来解决 FILE1.C
static int fx(void)
{
return int;
}
file2.c中
extern int fx(void);
/*call */
fx();