簡體   English   中英

為什么當枚舉或int值作為函數的bool傳遞時,gcc不會發出警告?

[英]Why does gcc not warn when an enum or int value is passed on as a function's argument which is bool?

我有以下代碼:

typedef enum
{
    FOO,
    BAR,
    BAZ
} foo_t;

static void afunc(bool is_it_on)
{
    /* do the job */
}

int main(void)
{
    afunc(BAZ);
    return 0;
}

編譯此代碼不會生成任何警告消息,即使為編譯器提供了-Wall -Wextra選項也是如此。 我甚至嘗試過使用-Wconversion選項,因為boolenum似乎與g ++的大小相同。 (就我所知, enum類型的大小未在規范中定義)

我已經梳理了gcc手冊並且沒有發現它。

問題:

  • 有沒有辦法強制編譯器在這種情況下生成警告?
  • 或者這個隱式轉換是否符合c ++規范?

我正在使用的編譯器:gcc 4.1.2


Editted

結論:

對此唯一可行的解​​決方案似乎是定義一個表示0或1的新類型,並使用它代替bool

代碼如下,g ++抱怨類型轉換:

typedef enum
{
    FOO1,
    FOO2
} foo_t;

typedef enum
{
    MY_FALSE,
    MY_TRUE
} my_bool_t;

void foo(my_bool_t a)
{
}

int main(void)
{
     /* 
      * gcc generates an error.
      * error: cannot convert ‘foo_t’ to ‘my_bool_t’ 
      * for argument ‘1’ to ‘void foo(my_bool_t)’
      */
    foo(FOO1);
    return 0;
}

是的,那些隱含的轉換是完全合法的。

C ++ 11 draft n3290,§4.12 布爾轉換

算術,無范圍枚舉,指針或指向成員類型的指針的prvalue可以轉換為bool類型的prvalue。 零值,空指針值或空成員指針值轉換為false; 任何其他值都轉換為true。 類型為std :: nullptr_t的prvalue可以轉換為bool類型的prvalue; 結果值為false。

這些轉換的警告(對於算術類型)可能會導致整個地方發出大量警告,我認為這不會是可管理的。

在C ++ 11中,您可以使用作用域枚舉來阻止隱式轉換:

由於缺少從Foobool的轉換,因此無法編譯:

enum class Foo { ONE };

void tryit(bool b) { }

int main()
{
    tryit(Foo::ONE);
}

暫無
暫無

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

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