2012-01-21 35 views
1

我正在努力让FreeGLUT在OSX上构建,并且正在运行许多同样问题的实例。许多功能仅存在于.c文件中。extern函数原型和静态定义

下面是一个例子

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 

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

回答

6

关键字extern前面的功能意味着external linkage
它使您可以使用其他Translation units中定义的函数到您自己的源文件中。
简而言之,它使您可以在另一个不包含声明的文件中使用fghRestoreState()

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

自上述错误以来,两个关键字一起使用时出现冲突。
你不能告诉编译器使所有文件都能看到这个函数(使用extern)&再次告诉它,把它从所有其他文件中隐藏(使用static)。

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

+0

这是我的理解,所以我不明白为什么图书馆会首先获得该代码。 有没有任何条件,这将有道理? 据我所知,没有ifdefs或任何会导致这种情况的原因。 – Kyle

+0

@凯尔:给出我的答案,你的编译器验证的,我想不出一个理由,为什么有人会这样做。 –