extern函数原型和静态定义

Kyl*_*yle 1 c macos gcc freeglut

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

这是一个例子

extern void fghRestoreState( void );

static void fghRestoreState( void ){...}
Run Code Online (Sandbox Code Playgroud)

我对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
Run Code Online (Sandbox Code Playgroud)

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

Alo*_*ave 6

extern函数前面的关键字表示外部链接.
它使您能够将其他翻译单元中定义的功能用于您自己的源文件.
简单来说,它使您能够fghRestoreState()在另一个不包含声明的文件中使用它.

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

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

因此,请根据您对函数的使用情况选择关键字.