1

私のプロジェクトでは、システム スレッド セーフ バージョンではない simple_xxxx.c があるため、同等のシステム スレッドを作成するために、sys_xxxx.cpp を作成しました。ここで、C コード全体が MyNameSpace という名前空間内に取り込まれます。ファイルには、コンパイル時に混乱を招く危険を冒すために simple_xxxx.h を含めていませんが、.cpp ファイルの宣言を取得するために sys_xxxx.h を含めています。そうしている間、名前空間内で宣言されているにもかかわらず、int と混同される以下の列挙型のコンパイル エラーが発生します。

これについての提案は大歓迎です。

// xxxx.h

namespace MyNameSpace {

typedef enum {
  FormatFlags_LeftAlign   = (1 << 0), // 1
  FormatFlags_SignPrefix  = (1 << 1), // 2
  FormatFlags_SpacePrefix = (1 << 2), // 4
  FormatFlags_ZeroPad     = (1 << 3), // 8
  FormatFlags_Format      = (1 << 4)  // 16
} FormatFlags;


bool string_AppendFormatted(UnicodeString_s*, UnicodeString_s*, void*);

}


///xxxx.cpp

namespace MyNameSpace {

bool string_AppendFormatted(UnicodeString_s*, UnicodeString_s*, void*)
{
      FormatFlags eFlags = (FormatFlags)0;

            case '-':
4086:         eFlags |= FormatFlags_LeftAlign;
              break;
            case '+':
4089:         eFlags |= FormatFlags_SignPrefix;
              break;
            case '0':
4092:         eFlags |= FormatFlags_ZeroPad;
              break;
} // method

} // namespace


xxxx.cpp: In function 'bool MyNameSpace::string_AppendFormatted(MyNameSpace::UnicodeString_s*, MyNameSpace::UnicodeString_s*, void*)':
xxxx.cpp:4086: error: invalid conversion from 'int' to 'MyNameSpace::FormatFlags'
xxxx.cpp:4089: error: invalid conversion from 'int' to 'MyNameSpace::FormatFlags'
xxxx.cpp:4092: error: invalid conversion from 'int' to 'MyNameSpace::FormatFlags'
4

3 に答える 3

1

C++ ではからintへの暗黙的な変換はありません。フラグを格納するには an を使用してください。また、列挙型を として宣言することもできます。これは C でのみ必要です。enumintenum FormatFlags{ /* values */ };typedef

于 2013-04-10T09:52:11.323 に答える
0

交換

FormatFlags eFlags = (FormatFlags)0;

int eFlags = 0;

エラー メッセージにあるように、列挙型の組み合わせ ( ) を列挙型にキャストすることはできませんint(これらの組み合わせの値は列挙型定義で定義されていないことに注意してください)。

于 2013-04-10T09:50:13.220 に答える
0

次のことを行うと、問題を解決できます。eFlags = (FormatFlags)(eFlags | FormatFlags_LeftAlign);

列挙型を int; として宣言すると、以下のコードにさらに問題が発生します(ここには示されていません)。

于 2013-04-12T12:51:40.493 に答える