簡體   English   中英

C - 枚舉的前向聲明?

[英]C - forward declaration of enums?

C 中枚舉的前向聲明對我不起作用。 我搜索了互聯網和 stackoverflow,但所有關於枚舉數前向聲明的問題都是指 C++。 在 C 中聲明枚舉器是做什么的? 將它們放在每個文件的頂部(或包含),以便文件中的所有函數都可以訪問它們? 謝謝

將它們放在標題中,以便所有需要它們的文件都可以訪問標題並使用其中的聲明。

使用選項編譯時:

$ /usr/bin/gcc -g -std=c99 -Wall -Wextra -c enum.c
$

GCC 4.2.1(在 MacOS X 10.7.1 上)接受以下代碼:

enum xyz;

struct qqq { enum xyz *p; };

enum xyz { abc, def, ghi, jkl };

添加-pedantic並警告:

$ /usr/bin/gcc -g -std=c99 -Wall -Wextra -pedantic -c enum.c
enum.c:1: warning: ISO C forbids forward references to ‘enum’ types
enum.c:5: warning: ISO C forbids forward references to ‘enum’ types
$

因此,您不應該嘗試在 C 中使用枚舉類型的前向聲明; GCC 允許將其作為不被迫迂腐的擴展。

您不能“向前聲明”枚舉,因為編譯器不知道枚舉的大小。 C 標准說“每個枚舉類型應與 char、有符號整數類型或無符號整數類型兼容。類型的選擇是實現定義的,但應能夠表示枚舉的所有成員的值” .

我來到這里時遇到了同樣的錯誤,但這里沒有提供太多關於代碼/錯誤的信息。

我的 Makefile 標志是: -Wall -Wextra -Werror -pedantic -std=c17

在我的標題中,我有以下enum

typedef enum 
{
  IS_HEAD = 1, 
  IS_VALUE = 2,
  IS_SIDE
} CoinResult;

這里那里的教程

建議使用這樣的東西:

enum CoinResult cr;
cr = IS_SIDE;

這會導致 OP 所述的錯誤。

通過使用解決:

CoinResult cr = IS_SIDE; 

不確定使用的是哪個 C 標准、代碼或參考 OP,但我有點同意:這個相對簡單的問題的大多數教程和解決方案都有些模棱兩可。

CoinResult 不是枚舉,而是一種類型。 如果你有

enum CoinResult {
    IS_HEAD = 1,
    IS_VALUE = 2,
    IS_SIDE,
};

然后

    enum CoinResult cr;

會是正確的。

暫無
暫無

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

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