1

編集できないヘッダーには、次の定義があります。

#define ENUM_SOMETHING_A "A"
#define ENUM_SOMETHING_B "B"
#define ENUM_SOMETHING_C "C"

これらを次のような列挙型でラップしたいと思います。

enum Something {
    A = ENUM_SOMETHING_A,
    B = ENUM_SOMETHING_B,
    C = ENUM_SOMETHING_C
};

ここで、Something::A は ENUM_SOMETHING_A の 10 進 ASCII 値などです。

これに対していくつかのアプローチを試みましたが、これを行う方法がわかりません。それは可能ですか?もしそうなら、どうすればそれを達成できますか? 繰り返しますが、#defines は変更できません。

キャストを試み、ENUM_SOMETHING_A[0] を試しましたが、どちらも機能しませんでした。また、これは C++0x ではありません。

4

3 に答える 3

4

列挙値を文字列にすることはできないため、列挙値を対応する文字列にマップする追加のメカニズムを追加する場合を除き、ここで列挙型を使用することは適切ではありません。ただし、次のようなことができます。

// Header
typedef char const * Something_value;

namespace Something
{
    Something_value const A;
    Something_value const B;
    Something_value const C;
}

// Implementation
namespace Something
{
    Something_value const A = ENUM_SOMETHING_A;
    Something_value const B = ENUM_SOMETHING_B;
    Something_value const C = ENUM_SOMETHING_C;
}
于 2012-11-13T22:11:06.357 に答える
1

できません。は、整数定数を使用して定義するenum必要があります。Achar*は定義上、整数定数ではありません。

あなたができる最善のことは、定数を同等のchar値にマップすることです(好みに合わせて算術的に調整できます):

#define MY_ENUM_SOMETHING_A (ENUM_SOMETHING_A[0]) /* 65 */
#define MY_ENUM_SOMETHING_B (ENUM_SOMETHING_B[0]) /* 66 */
#define MY_ENUM_SOMETHING_C (ENUM_SOMETHING_C[0]) /* 67 */
于 2012-11-13T22:11:30.507 に答える
1

言語内でこれを行うことはできません。ただし、編集できないヘッダーから必要な列挙型を生成するシェル スクリプトを作成することはできます。次のようになります。

#! /bin/sh
# usage: define2enum input output

set -e
exec > "$2"
echo 'enum Something {'
sed -ne 's/^#define ENUM_SOMETHING_\([A-Za-z0-9][A-Za-z0-9]*\) "\(.\)"$/    \1 = '\''\2'\'',/p' < "$1"
echo '};'    
于 2012-11-13T22:16:36.313 に答える