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

时间:2012-12-09 13:55:11

标签: c static extern

假设代码:

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]

那么,我怎样才能声明静态函数?

4 个答案:

答案 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();