簡體   English   中英

分配枚舉變量的值超出枚舉范圍是否有警告?

[英]Is there a warning for assigning an enum variable with a value out of the range of the enum?

我有一個使用enum作為參數的 C 函數,如下例所示:

typedef enum
{
  AB, 
  CD
} A;

void f(A input)
{
  // do something
}

int main(void)
{
   // do something
   f(-10);
   // do something
}

是否有一個警告,我可以啟用分配值超出枚舉范圍的枚舉變量?

在 GCC 錯誤數據庫中有一個開放的錯誤 似乎 GCC 還沒有包含這樣的功能。 有一個名為-Wc++-compat的選項,它會抱怨 - 在無數其他事情中,關於任何整數被隱式轉換為枚舉類型。

一個相關的功能剛剛登陸 GCC 存儲庫。 在 GCC 主干中(但不是在 9.2.1 中,它是 Ubuntu 19.10 的編譯器),有一個開關-Wenum-conversion ,它會警告使用無關的枚舉值,但不是裸整數; 即在下面的代碼中,它會警告后一個函數調用,而不是前一個。

typedef enum{ AB, CD } A;

typedef enum{ EF, GH } B;

void f(A input){
    (void)input;
}

int main(void){
    f(-10);
    f(GH);
}

使用-Wenum-conversion編譯的診斷結果是

<source>: In function 'main':
<source>:18:6: warning: implicit conversion from 'enum <anonymous>' to 'A' [-Wenum-conversion]
   18 |    f(GH);
      |      ^~

即使enum是用戶定義的類型,編譯器也會將其翻譯為原始類型,在我的情況下是int ,您可以使用以下方法檢查它:

#include <stdio.h>

#define printHelloIfEnumIsInt(x) \
    _Generic(x, int: puts("Hello"));

typedef enum {
  AB, 
  CD
} A;

int main(void)
{
    printHelloIfEnumIsInt(AB);
    return 0;
}

返回:

Hello

因此允許INT_MIN ... INT_MAX范圍內的任何值。

我不認為有什么好的方法可以做到。 但是,如果您不在 enum 中使用任何=enum foo {a=0, b=4} ,您可以這樣做:

typedef enum{
  AB, 
  CD,
  A_max // Extra field that should be last
} A;

void f(A input){
    assert(input >= 0 && input < A_max);
    //  Do something
}

這是有效的,因為如果不使用= ,第一個元素將為零,並且以下所有元素將為它們中的每一個添加 1。

暫無
暫無

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

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