将#defined'd char *转换为枚举值

时间:2012-11-13 22:05:48

标签: c++

在我无法编辑的标题中,我有以下定义:

#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
};

Where Something :: A是ENUM_SOMETHING_A的十进制ASCII值,依此类推。

我已经尝试了几种方法,但我无法弄清楚如何做到这一点。是否可能,如果可能,我该如何实现?同样,#define无法更改。

我尝试了演员,我尝试了ENUM_SOMETHING_A [0],但都没有奏效。另外 - 这不是C ++ 0x。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

你不能。必须使用整数常量定义enum。根据定义,char*不是整数常量。

您可以做的最好的事情是将常量映射到等效的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 */

答案 2 :(得分:1)

你不能在语言中这样做。但是,您可以编写一个shell脚本,该脚本可以从您无法编辑的标题中生成所需的枚举。它看起来像这样:

#! /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 '};'