65.9K
CodeProject 正在变化。 阅读更多。
Home

将 C++ 枚举转换为字符串

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.28/5 (14投票s)

2005年5月27日

viewsIcon

179535

downloadIcon

1034

如何将 C++ 枚举转换为字符串。

引言

这段代码用于将 C++ 枚举值转换为其等效的字符串表示形式。例如,这对于调试代码或生成跟踪消息非常有用。

使用代码

创建一个名为“EnumToString.h”的头文件,内容如下

// File name: "EnumToString.h"
#undef DECL_ENUM_ELEMENT
#undef BEGIN_ENUM
#undef END_ENUM

#ifndef GENERATE_ENUM_STRINGS
    #define DECL_ENUM_ELEMENT( element ) element
    #define BEGIN_ENUM( ENUM_NAME ) typedef enum tag##ENUM_NAME
    #define END_ENUM( ENUM_NAME ) ENUM_NAME; \
            char* GetString##ENUM_NAME(enum tag##ENUM_NAME index);
#else
    #define DECL_ENUM_ELEMENT( element ) #element
    #define BEGIN_ENUM( ENUM_NAME ) char* gs_##ENUM_NAME [] =
    #define END_ENUM( ENUM_NAME ) ; char* GetString##ENUM_NAME(enum \
            tag##ENUM_NAME index){ return gs_##ENUM_NAME [index]; }
#endif

将你的 enum 放在一个特定的头文件中,使用特殊的语法。例如,enum

enum Days
{
   sunday,
   monday,
   tuesday,
   wednesday,
   thursday,
   friday,
   saturday
};

将成为一个名为“Days.h”的头文件,内容如下

// File name: "Days.h"
#if ( !defined(DAYS_H) || defined(GENERATE_ENUM_STRINGS) )

#if (!defined(GENERATE_ENUM_STRINGS))
    #define DAYS_H
#endif

#include "EnumToString.h"

///////////////////////////////
// The enum declaration
///////////////////////////////
BEGIN_ENUM(Days)
{
    DECL_ENUM_ELEMENT(sunday),
    DECL_ENUM_ELEMENT(monday),
    DECL_ENUM_ELEMENT(tuesday),
    DECL_ENUM_ELEMENT(wednesday),
    DECL_ENUM_ELEMENT(thursday),
    DECL_ENUM_ELEMENT(friday),
    DECL_ENUM_ELEMENT(saturday)
}
END_ENUM(Days)

#endif // (!defined(DAYS_H) || defined(GENERATE_ENUM_STRINGS))

在任何需要 enum Days 的地方包含文件“Days.h”。像使用普通枚举一样使用它

#include "Days.h"

void MyFunction( Days day )
{
    CString message;
    switch( day )
    {
        case monday:
        case tuesday:
        case wednesday:
        case thursday:
        case friday:
        {
            message.Format("Today is %s, I have to work!", 
                           GetStringDays(day) );
        }
        break;

        case saturday:
        case sunday:
        {
            message.Format("Today is %s, very nice!!!", 
                           GetStringDays(day) );
        }
        break;
    }
    AfxMessageBox(message);                       
}

创建一个 CPP 模块,其中实际定义了与 enum 关联的字符串

// File name: "EnumToString.cpp"

/// The strings associated with the enums are gererated here
/////////////////////////////////////////////////////////////////////
#define GENERATE_ENUM_STRINGS  // Start string generation
#include "Days.h"             
#include "OtherEnum.h"
#include "AnotherOne.h"
#undef GENERATE_ENUM_STRINGS   // Stop string generation
© . All rights reserved.