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 的十进制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

你不能在语言中做到这一点。但是,您可以编写一个 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 '};'    
于 2012-11-13T22:16:36.313 回答