首頁 > 後端開發 > Golang > 主體

C 中函數類型的前向聲明

王林
發布: 2024-02-08 22:00:12
轉載
862 人瀏覽過

C 中函数类型的前向声明

php小編子墨為您介紹C語言中函數型別的前向宣告。在C語言中,函數類型的前向宣告是一種宣告函數但不進行定義的方式。透過前向聲明,我們可以讓編譯器在後續程式碼中識別和使用這些函數,而無需事先定義它們。這在解決函數間相互呼叫的問題上非常有用,特別是在編寫大型程式時。透過使用函數類型的前向聲明,我們可以提高程式碼的可讀性和可維護性,使程式碼更加模組化和結構化。讓我們深入了解這重要的C語言特性。

問題內容

我想在 C 中宣告一個遞歸函數型別(宣告自身的函數)。

用像 Go 這樣的語言我可以做到:

<code>type F func() F

func foo() F {
  return foo
}
</code>
登入後複製

如果我嘗試在 C 中執行相同的操作:

typedef (*F)(F());
登入後複製

我從 GCC 收到以下錯誤:

main.c:1:14: error: unknown type name ‘F’
    1 | typedef (*F)(F());
登入後複製

這是有道理的,因為 F 在使用時並不存在。前向宣告可以解決這個問題,如何在 C 中前向宣告函數型別?

解決方法

C 不支援遞歸型別定義。

例外:您可以使用指向尚未宣告的結構類型的指針,因此結構類型可以包含指向正在宣告的結構類型的結構的指標。

此外,您顯然可以使用尚未宣告的結構類型作為函數的傳回值。所以這很接近你想要的:

// This effectively gives us
// typedef struct { F *f } F( void );

typedef struct S S;

typedef S F( void );

struct S {
   F *f;
};

S foo() {
   return (S){ foo };
}

int main( void ) {
   F *f = foo;
   printf( "%p\n", (void*)f );

   f = f().f;
   printf( "%p\n", (void*)f );
}
登入後複製

以上是C 中函數類型的前向聲明的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板