1

我正在努力让 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

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

4

1 回答 1

6

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

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

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

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

于 2012-01-21T05:40:18.420 回答