【问题标题】:extern function prototype and static definitionextern 函数原型和静态定义
【发布时间】:2012-01-21 05:38:41
【问题描述】:

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

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

【问题讨论】:

    标签: c macos gcc freeglut


    【解决方案1】:

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

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

    错误,因为如上所述,两个关键字一起使用时存在冲突。
    你不能告诉编译器让所有文件都能看到这个功能(使用extern)并再次告诉它,从所有其他文件中隐藏它(使用static)。

    所以根据你对函数的使用情况选择关键字。

    【讨论】:

    • 那是我的理解,所以我不明白为什么图书馆首先会有那个代码。有什么条件可以做到这一点吗?据我所知,没有 ifdef 或任何可以使这变得有意义的东西。
    • @Kyle:鉴于我的回答,你的编译器验证的,我想不出一个原因,为什么有人会这样做。
    猜你喜欢
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多