簡體   English   中英

如何將枚舉與其第零個值進行比較?

[英]How do I compare an enum with its zeroth value?

在 c 中,標准沒有定義枚舉是有符號還是無符號。 但是,當我嘗試將枚舉值與最低(即 0)枚舉常量進行比較時,我收到警告“無符號整數與零的無意義比較”。 (編譯器是 IAR 嵌入式工作台。)

typedef enum
{
    BAR,
    BAZ
} Foo;

//later...
Foo x = (Foo)some_integral_value;
if (x >= BAR) // <- this gives me the warning
    //stuff

但是,我需要檢查枚舉的范圍,因為它是從整數類型轉換而來的。 是否有避免警告的好方法,如果編譯器決定更改基礎類型,它仍然有效?

在C語言中,這是一個錯誤的問題。

  • 無論如何,所有枚舉常量始終為int類型
  • 來回轉換枚舉類型與隱式轉換很容易,不需要顯式轉換(也稱為AKA強制轉換)

現在到你的例子

enum Foo
{
    BAR,
    BAZ
};

//later...
Foo x = (Foo)some_integral_value;

這甚至不會編譯,因為在C Foo中沒有將其定義為任何東西,您必須使用enum Foo或提供適當的typedef ,例如

typedef enum Foo Foo;

也許您使用C ++編譯器來編譯C代碼? 無論如何,請提供一個完整的示例來說明您的問題。

聽起來像在C語言中,所有枚舉都應具有int類型,但是我遺漏了這些建議,因為您的編譯器是非標准C或編譯為C ++。


如果您可以控制這些枚舉的定義,則可以使它們從1開始:

enum Foo
{
    BAR = 1,
    BAZ
};

您還可以添加一個假的負值以強制對其進行簽名:

enum Foo
{
    NEGATIVE_PLACEHOLDER = -1,
    BAR,
    BAZ,
};

在C ++ 11中,可以給枚舉一個顯式的基礎類型:

enum Foo : int
{
    BAR,
    BAZ
};

請參閱此頁面 ,特別是顯示以下內容的部分:

enum name : type { enumerator = constexpr , enumerator = constexpr , ... }

...

2)聲明一個無范圍的枚舉類型,其基礎類型是固定的

聽起來類型應該始終是可預測的:

非范圍枚舉類型的值可以隱式轉換為整數類型。 如果基礎類型不是固定的,則該值是以下列表中可轉換的第一類型,該類型可以保留其整個值范圍: intunsigned intlongunsigned longlong longunsigned long long 如果基礎類型是固定的,則可以將值轉換為其提升的基礎類型。

因此,如果您的枚舉適合int ,則應始終使用int

布倫丹的第一個評論適用於C和不回答這個問題。 也就是說,將枚舉中第一項的值強制為1可以消除編譯警告。 在原始發布者的情況下,這是否是一個可行的答案取決於第一個值是否必須由於其他原因而為零。

ps對不起,我沒有評論我所評論的問題,而是發布了對問題的答復,但是Stack Overflow不允許我這樣做。

暫無
暫無

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

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