10

私は次のコードを持っています:

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オプションを試してみましたが、g ++と同じサイズのように見えたためbool、効果がありませんでした。(私が知る限り、型enumのサイズは仕様で定義されていません)enum

gcc のマニュアルをくまなく調べましたが、何も見つかりませんでした。

質問:

  • このような場合にコンパイラに警告を生成させる方法はありますか?
  • それとも、この暗黙のキャストは c++ 仕様で合法なのでしょうか?

使用しているコンパイラ: gcc 4.1.2


編集済み

結論:

これに対する唯一の実行可能な解決策は、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;
}
4

1 に答える 1

9

はい、これらの暗黙的な変換は完全に合法です。

C++11 ドラフト n3290、§4.12ブール変換:

算術、スコープなし列挙、ポインター、またはメンバー型へのポインターの prvalue は、bool 型の prvalue に変換できます。ゼロ値、NULL ポインター値、または NULL メンバー ポインター値は false に変換されます。その他の値は true に変換されます。std::nullptr_t 型の prvalue は bool 型の prvalue に変換できます。結果の値は false です。

これらの変換 (算術型の場合) に関する警告は、おそらくいたるところに膨大な数の警告をもたらすことになるでしょう。

C++11 では、スコープ付き列挙型を使用して暗黙的な変換を防ぐことができます。

Fooこれは からへの変換がないためにコンパイルに失敗しますbool:

enum class Foo { ONE };

void tryit(bool b) { }

int main()
{
    tryit(Foo::ONE);
}
于 2012-05-05T17:42:59.307 に答える