3

私がこのように書いた場合:

typedef enum {
  foo_1,
  foo_2
}foo ;

使えることがわかりました

int footype = foo::foo_1C++で

直接使用できます

int footype = foo_1cでは、

では、c ++とcの両方で機能する同じコードを記述できる方法はありますか?コードは、構造が1つしかない1つのヘッダーファイル内にあります。

4

3 に答える 3

6
int footype = foo_1;

これはCとC++の両方でコンパイルされます。

int footype = foo::foo_1;

この構文は、C++11の強く型付けされた列挙型にのみ必要です。

于 2012-11-07T15:16:55.130 に答える
4

これ

int footype = foo::foo_1

C++11でのみ有効です。C ++ 03では、列挙型はスコープではなく、Cと同様に、これは違法です。C++ 11では、通常のCのような列挙型とスコープ付き列挙型の2種類の列挙型があります。

 enum class

後者の場合、列挙子qualification(::)は必須です。前者の場合-オプション。

だから、単に使用する

int footype foo = foo_1;

すべてのC、C ++ 03、C++11で動作します

于 2012-11-07T15:16:10.287 に答える
1

typedefを削除しても問題がない場合は、「正常に機能する」はずです。

enum {
    foo_1,
    foo_2
};

int
main(void)
{
    int foo = foo_1;

    return 0;
}

それはgccとg++の両方で私のためにコンパイルされます

g++ --std=c++03 enum.cc -o enum_cpp
gcc --std=c99 enum.c -o enum_c
于 2012-11-07T15:18:02.147 に答える