在C 中轉發聲明枚舉:限制和解決方法
在C 中,轉發聲明枚舉以前是不可能的,因為枚舉的大小取決於它的內容。然而,隨著 C 11 的引入,只要明確指定枚舉的大小,前向聲明就成為可能。
問題陳述:
最初的問題出現了當嘗試透過以下方式轉發聲明枚舉時:
enum E; void Foo(E e); enum E {A, B, C};
此程式碼被拒絕
解釋:
在 C 03 及更早版本中,不允許前向聲明枚舉,因為編譯器需要知道枚舉的大小才能儲存它的值。枚舉的大小取決於其枚舉值的數量和類型。如果沒有此訊息,編譯器無法為枚舉分配記憶體。
C 11 及以上版本中的解:
在C 11 及更高版本中,前向聲明枚舉可以透過明確指定列舉的大小來實現。這可以使用枚舉來完成:
例如:
enum Enum : unsigned int; // Forward declaration with an underlying type void Foo(Enum e); // Definition of the enum in a separate source file enum Enum { VALUE1, VALUE2, VALUE3 };
此程式碼現在將成功編譯。
私有枚舉值的注意事項:
在提到的特定場景中,枚舉值應該保密,前瞻性聲明方法仍然可行。枚舉可以在頭文件中私有聲明並在實作文件中內部定義,而不會將枚舉值暴露給客戶端。
但是,需要注意的是,前向聲明不會阻止訪問內的枚舉值相同的翻譯單元(即相同的源文件或編譯在一起的文件集)。因此,仍然可以從有權存取頭文件的程式其他部分存取枚舉值。
以上是我可以在 C 中轉發聲明枚舉嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!