在C++中有一种简单的方法可以将字符串转换为枚举(类似于Enum.ParseC#)吗?switch语句会很长,所以我想知道是否有更简单的方法可以做到这一点?
编辑:
感谢您的所有回复.我意识到,对于我的特定情况,有一种更简单的方法.字符串总是包含字符'S'后跟一些数字,所以我只是做了
int i = atoi(myStr.c_str() + 1);
Run Code Online (Sandbox Code Playgroud)
然后切换i.
假设您要生成标识符和字符串的匹配列表
enum
{
NAME_ONE,
NAME_TWO,
NAME_THREE
};
myFunction(NAME_ONE, "NAME_ONE");
myFunction(NAME_TWO, "NAME_TWO");
myFunction(NAME_THREE, "NAME_THREE");
Run Code Online (Sandbox Code Playgroud)
..没有重复自己,没有自动生成代码,使用C/C++宏
初步猜测:
您可以添加包含的#include文件
myDefine(NAME_ONE)
myDefine(NAME_TWO)
myDefine(NAME_THREE)
Run Code Online (Sandbox Code Playgroud)
然后使用它两次,如:
#define myDefine(a) a,
enum {
#include "definitions"
}
#undef myDefine
#define myDefine(a) myFunc(a, "a");
#include "definitions"
#undef myDefine
Run Code Online (Sandbox Code Playgroud)
但#define不允许你在字符串中放置参数?
是否有一种方便的方法来获取字符串(由用户输入)并将其转换为枚举值?在这种情况下,字符串将是枚举值的名称,如下所示:
enum Day
{
Sunday = 0,
Monday = 1,
...
}
Run Code Online (Sandbox Code Playgroud)
因此,如果用户给出了Day的名称,则可以将其解析为相应的Enum值.
诀窍是,我有超过500个我正在使用的值,它们分布在多个枚举中.
我知道c#中的Enum.Parse方法,所以在c中有这种形式吗?
我正在阅读一个文件中相同标题的多个包含,并找到一个有趣的声明(链接):
有两个带头文件的技巧是你故意多次包含它(这确实提供了一个有用的功能).
据我所知,这些技巧可能在实际项目中不受欢迎和困惑(特别是因为人们会采取预防措施来防范多种内容,例如包括警卫和内部人员#pragma once).但是,那些技巧是什么?我提出了一些想法,但希望看到一些实际的例子(理想情况下,安全和尝试).
我的想法:
可能重复:
在C中使用枚举类型变量作为字符串的简单方法?
除了手动方式之外,是否有任何将用户输入字符串转换为ENUM值的优雅方式是直接C.
调用以ENUM作为参数的函数的简化示例:
enum = {MONDAY,TUESDAY,WEDNESDAY};
...
//Get user to enter a day of the week from command line
...
//Set the work day according to user input
if (strcmp(user_input,"MONDAY")==0){
SET_WORK_DAY(MONDAY);
} else if (strcmp(user_input,"TUESDAY")==0){
SET_WORK_DAY(TUESDAY);
}
...
Run Code Online (Sandbox Code Playgroud)
谢谢
gcc 4.4.2 c89
我有以下枚举:
enum drop_options_e
{
drop_ssm,
drop_snm,
drop_ssb
};
Run Code Online (Sandbox Code Playgroud)
我只是想知道这是从枚举中获取字符串表示值的最佳方法.
所以基本上,不是为drop_ssm返回值0,而是可以获得'drop_ssm'.
非常感谢任何建议,
我有一个枚举Eg.
enum {
APPLE,
MANGO,
BANANA
}
Run Code Online (Sandbox Code Playgroud)
和相应的字符串数组
char fruits[] =
{
"apple",
"mango",
"banana"
}
Run Code Online (Sandbox Code Playgroud)
我需要检索字符串的索引,因为我有字符串.因此,如果字符串是苹果,我需要得到0,依此类推.[ Enum另外,可能有助于解决方案]
是否有一种优雅的方式,保存[apple,0],[banana,1]简短,我可以用作宏.我不需要像哈希表那样冗长的东西.可以Enum协助映射吗?
typedef enum testCaseId {"TC-HIW-0019"= 0,
"TC-HIW-0020","TC-HIW-0021"
} testCaseId;
我需要在枚举中表示我的测试用例.在我的测试功能中,我需要在测试用例之间切换,如:
void testfunc(uint8_t no)
{
switch(no)
{
case 0:
case 1:
default:
}
}
Run Code Online (Sandbox Code Playgroud)
所以任何人都可以帮助如何使用枚举来声明字符串.
假设我们将一些错误代码定义为宏 -
#define ERR_SUCCESS 0
#define ERR_BAD_INPUT 1
Run Code Online (Sandbox Code Playgroud)
...
或者作为枚举数据类型 -
enum err_t = { ERR_SUCCESS, ERR_BAD_INPUT, ...};
Run Code Online (Sandbox Code Playgroud)
其中一个id由以下函数返回 -
int foo(); /* if foo() returns 0, it means success, etc */
Run Code Online (Sandbox Code Playgroud)
调用者foo()可以确定哪个标识符/名称(ERR_SUCCESS,ERR_BAD_INPUT,...)链接到int返回值?
我有一个文件有一些定义,如:
TRACE( tra_1, "AA")
TRACE( tra_1, "BB")
TRACE( tra_1, "CC")
TRACE( tra_1, "DD")
TRACE( tra_1, "EE")
..
Run Code Online (Sandbox Code Playgroud)
等等.其中AA,BB,CC,DD和EE是字符串.
我想从文件中获取这些TRACE定义并将它们转换为枚举.预处理器的输出应如下所示:
typedef enum{
AA,
BB,
CC,
DD,
EE
} TRACE;
Run Code Online (Sandbox Code Playgroud)