簡體   English   中英

外部函數原型和靜態定義

[英]extern function prototype and static definition

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

我的問題是,他們有任何理由設置這種方式嗎? 它可以在其他平台上正確編譯嗎?

該函數前面的關鍵字extern表示外部鏈接
它使您可以將其他轉換單元中定義的功能用於自己的源文件。
簡而言之,它使您可以在不包含fghRestoreState()聲明的另一個文件中使用它。

而關鍵字static表示Internal Linkage ,即該函數僅在定義和聲明該文件的文件中可見。
用簡單的話說,它告訴編譯器我將僅在此源文件中使用此功能,因此將其對我項目中的所有其他文件隱藏。

由於出現上述錯誤,因此將兩個關鍵字一起使用會產生沖突。
您不能告訴編譯器使所有文件都能看到此功能(使用extern )並再次告訴它,將其對所有其他文件隱藏(使用static )。

因此,請根據您對函數的使用情況選擇關鍵字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM