extern函数原型和静态定义

时间:2012-01-21 05:38:42

标签: c macos gcc freeglut

我正在努力让FreeGLUT在OSX上构建,并且遇到了同样问题的许多实例。许多功能仅存在于.c文件中。

这是一个例子

extern void fghRestoreState( void );

static void fghRestoreState( void ){...}

我对C的理解有限,但编译器错误似乎有意义:

src/Common/freeglut_gamemode.c:252: error: static declaration of ‘fghRestoreState’ follows non-static declaration
src/Common/freeglut_gamemode.c:43: error: previous declaration of ‘fghRestoreState’ was here

我的问题是,他们是否有任何理由这样设置?它会在其他平台上正确编译吗?

1 个答案:

答案 0 :(得分:6)

功能前面的关键字extern表示 external linkage
它使您能够将其他 Translation units 中定义的函数用于您自己的源文件 简单来说,它允许您在另一个不包含声明的文件中使用fghRestoreState()

然而,关键字static意味着Internal Linkage,即该函数应仅在其定义和声明的文件中可见。
简单来说,它告诉编译器我将仅在此源文件中使用此函数,因此将其隐藏在项目中的所有其他文件中。

由于上述错误,因此将两个关键字一起使用存在冲突 您无法告诉编译器启用所有文件以查看此功能(使用extern)&再次告诉它,将其隐藏在所有其他文件中(使用static)。

因此,请根据您对该功能的使用情况选择关键字。