我正在努力让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
我的问题是,他们是否有任何理由这样设置?它会在其他平台上正确编译吗?
答案 0 :(得分:6)
功能前面的关键字extern
表示 external linkage 。
它使您能够将其他 Translation units 中定义的函数用于您自己的源文件
简单来说,它允许您在另一个不包含声明的文件中使用fghRestoreState()
。
然而,关键字static
意味着Internal Linkage
,即该函数应仅在其定义和声明的文件中可见。
简单来说,它告诉编译器我将仅在此源文件中使用此函数,因此将其隐藏在项目中的所有其他文件中。
由于上述错误,因此将两个关键字一起使用存在冲突
您无法告诉编译器启用所有文件以查看此功能(使用extern
)&再次告诉它,将其隐藏在所有其他文件中(使用static
)。
因此,请根据您对该功能的使用情况选择关键字。