簡體   English   中英

如何檢查枚舉變量是否有效?

[英]How to check if an enum variable is valid?

我有一個枚舉:

enum myenum{
  typeA,
  typeB,
  typeC
} myenum_t;

然后,使用enum參數調用函數:

int myfunction(myenum_t param1)
{
  switch(param1)
  {
    case typeA:
    case typeB:
    case typeC:
      //do the work
      break;

    default:
      printf("Invalid parameter");
  }
  return 0;
}

但是,隨着myenum_t越來越多的價值增長, myfunction似乎並不那么優雅。

有沒有更好的方法來檢查枚舉是否有效?

一個常見的慣例是做這樣的事情:

typedef enum {
  typeA,
  typeB,
  typeC,
  num_types
} myenum_t;

然后你可以檢查(t < num_types)

如果您隨后添加更多枚舉,例如

typedef enum {
  typeA,
  typeB,
  typeC,
  typeD,
  typeE,
  num_types
} myenum_t;

然后num_types會自動更新,您的錯誤檢查代碼無需更改。

您可以使用按位枚舉:

enum myEnum {
    typeA = 1 << 0;
    typeB = 1 << 1;
    typeC = 1 << 2;
}

int myFunction(myEnum arg1)
{
    int checkVal = typeA | typeB | typeC;

    if (checkVal & arg1)
    {
        // do work here;
    }
    else
    {
        printf("invalid argument!");
    }

    return 0;
}

對不起,我覺得這個問題看錯了。

看來你想要做的是確定你是否傳入了適當的值,而不是一些隨機的無效選項。 在這種情況下,最合乎邏輯的選擇是:

if (arg1 < typeA || arg1 > typeC)
    printf("invalid argument");

當然,這是假設您沒有為枚舉設置手動值,除非使用按位枚舉,否則這很少見。

是。

讓編譯器完成它的工作,不要將int轉換為enum類型,你應該很好。

我過去使用的一個技巧:

enum foo {FIRST_FOO, BAR, BLETCH, BLURGA, BLAH, LAST_FOO};

然后檢查您的值是否> FIRST_FOO && < LAST_FOO 1

當然,這假設您的枚舉值之間沒有間隙。

否則,不,沒有好的方法來做你所要求的(至少在C中)。


1來自最新的在線C語言標准

6.7.2.2枚舉說明符
...
3枚舉器列表中的標識符聲明為具有int類型的常量,並且可以出現在允許的位置。 109)=的枚舉數將其枚舉常量定義為常量表達式的值。 如果第一個枚舉數沒有= ,則其枚舉常量的值為0 具有no =每個后續枚舉器將​​其枚舉常量定義為通過將1添加到先前枚舉常量的值而獲得的常量表達式的值。 (枚舉器與=的使用可能會產生枚舉常量,其值與同一枚舉中的其他值重復。)枚舉的枚舉數也稱為其成員。

你也不能做類似的事情

enum myEnum {typeA,typeB, typeC};

int myFunction (myEnum arg1) {
    if (arg1 >= typeA && arg1 <= typeC) {
        // do work here
    } else {
        printf("invalid argument!");
    }
    return 0;
}

不幸的是,沒有一種簡單的方法來實現語言級別(至少使用C ),您只需要確保只使用通過enum定義的變量。

雖然您可以與-Werror一起啟用以下編譯器警告-Werror

  • -Wswitch
  • -Wswitch-default
  • -Wswitch-enum

如果在交換機內部遺漏了其中一個枚舉,則會導致構建失敗。

C ++中的枚舉已經比C中的枚舉更強。

采取以下簡單程序:

#include <iostream>

enum E
{
    A,
    B 
};

void f(E e)
{
}

int main()
{
    f(1);
}

使用GCC編譯器,我將收到此錯誤:

enum.cpp: In function ‘int main()’:
enum.cpp:15: error: invalid conversion from ‘int’ to ‘E’
enum.cpp:15: error:   initializing argument 1 of ‘void f(E)’

因此,您可以看到已經檢查了枚舉成員。

如果您想要更強大的類型檢查,並且具有支持C ++ 11的編譯器,您可以對枚舉使用更強大的類型檢查,請參閱http://en.wikipedia.org/wiki/C%2B%2B11#Strongly_typed_enumerations

暫無
暫無

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

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