Tag: enums

如何在C中模拟强类型枚举?

在C ++ 03中,可以通过将其置于类(或命名空间)中来模拟强类型枚举 : struct MyEnum { enum enumName { VALUE_1 = 1, VALUE_2, }; }; 并使用它: MyEnum::enumName v = MyEnum::VALUE_1; 是否有可能在C中做类似的事情? 如果有,怎么样? 我试过这样,但当然不起作用: struct A { enum aa { V1 = 5 }; }; int main() { A::aa a1 = A::V1; enum A::aa a2 = A::V1; struct A::aa a3 = A::V1; return 0; }

如何检查枚举变量是否有效?

我有一个枚举: enum myenum{ typeA, typeB, typeC } myenum_t; 然后,使用枚举参数调用函数: int myfunction(myenum_t param1) { switch(param1) { case typeA: case typeB: case typeC: //do the work break; default: printf(“Invalid parameter”); } return 0; } 但是,随着myenum_t随着越来越多的值而增长, myfunction似乎并不那么优雅。 有没有更好的方法来检查枚举是否有效?

C – 枚举的前向声明?

在C中转发枚举对我来说不起作用。 我搜索了互联网和stackoverflow,但所有关于枚举器前向声明的问题都引用了c ++。 你在C中声明枚举器怎么办? 将它们放在每个文件的顶部(或包含在内),以便文件中的所有函数都可以访问它们? 谢谢

C / C ++创建一个带负值的枚举,无需编号

例如在C / C ++中,我会得到代码: typedef enum fruits{ apple, banana, lemon, orange } fruit_t; 这相当于: typedef enum fruits{ apple = 0, banana = 1, lemon = 2, orange = 3 } fruit_t; 但是,我希望这些值是负数,因此它们不会与其他任何内容发生冲突。 我可以这样做: typedef enum fruits{ apple = -1, banana = -2, lemon = -3, orange = -4 } fruit_t; 但是如果我想添加另一个水果,我必须分配另一个值,如果我把它放在其中,我必须重新编号其中的大部分。 有更简单的方法吗?

#define vs. enums用于寻址外设

我必须在基于ARM9的微控制器中编程外设寄存器。 例如,对于USART,我将相关的内存地址存储在enum : enum USART { US_BASE = (int) 0xFFFC4000, US_BRGR = US_BASE + 0x16, //… }; 然后,我在函数中使用指针来初始化寄存器: void init_usart (void) { vuint* pBRGR = (vuint*) US_BRGR; *pBRGR = 0x030C; //… } 但我的老师说我最好使用#define ,例如: #define US_BASE (0xFFFC4000) #define US_BRGR (US_BASE + 0x16) #define pBRGR ((vuint*) US_BRGR) void init_usart (void) { *pBRGR = 0x030C; } 他说,就像这样,你没有在堆栈中分配指针的开销。 […]

在C ++中使用C标志枚举

我有一个C API,它定义了一个枚举,如下所示: typedef enum { C_ENUM_VALUE_NONE = 0, C_ENUM_VALUE_APPLE = (1 << 0), C_ENUM_VALUE_BANANA = (1 << 1), C_ENUM_VALUE_COCONUT = (1 << 2), // etc. C_ENUM_VALUE_ANY = ~0 } CEnumType; 有一种使用枚举的方法,定义如下: void do_something(CEnumType types); 在C中,您可以调用以下内容: do_something(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA); 但是,如果您尝试在C ++(Linux,g ++编译器)中以这种方式调用它,则会出现错误, 从“int”到“CEnumType”的无效转换 。 从我的C ++应用程序中使用此C API的正确方法是什么?

Objective-C / C给出枚举默认值

我在某处读到了枚举默认值,如下所示: typedef enum { MarketNavigationTypeNone = 0, MarketNavigationTypeHeirachy = 1, MarketNavigationTypeMarket = 2 } MarketNavigationLevelType; ..但我不记得这样做的价值。 如果我不给他们默认值 – 然后有人后来重新订阅枚举 – 有什么风险? 如果我总是使用枚举名称,甚至不用它们的整数值来引用它们,那么有任何风险吗? 我能想到的唯一可能的问题是,如果我从数据库中的int值初始化枚举 – 并且重新排序枚举 – 那么应用程序将会中断。

为什么我在C ++中得到“错误:期望’}’”但在C中没有?

我收到”error: expected ‘}'”当我在以下C ++源代码中编译时,’^’指向的位置: typedef enum { false, true } Boolean; ^ 当我将它编译为C源代码时,我没有收到此错误。 这是什么原因? 我很难过!

令人困惑的MACRO和枚举定义

我正在浏览一些Route netlink源代码。 我想弄清楚RTNLGRP_NEIGH的价值是什么 资料来源: http : //lxr.free-electrons.com/source/include/linux/rtnetlink.h?v = 2.6.35#L550 541 /* RTnetlink multicast groups */ 542 enum rtnetlink_groups { 543 RTNLGRP_NONE, 544 #define RTNLGRP_NONE RTNLGRP_NONE 545 RTNLGRP_LINK, 546 #define RTNLGRP_LINK RTNLGRP_LINK 547 RTNLGRP_NOTIFY, 548 #define RTNLGRP_NOTIFY RTNLGRP_NOTIFY 549 RTNLGRP_NEIGH, 550 #define RTNLGRP_NEIGH RTNLGRP_NEIGH 551 RTNLGRP_TC, 552 #define RTNLGRP_TC RTNLGRP_TC 553 RTNLGRP_IPV4_IFADDR, 554 #define RTNLGRP_IPV4_IFADDR RTNLGRP_IPV4_IFADDR […]

使用C中的索引访问枚举

考虑: enum Test { a = 3, b = 7, c = 1 }; 我想使用索引访问枚举。 像这样的东西: for (i=0; i<n; i++) doSomething((Test)i); 我怎么能做这样的事情,我可以使用索引访问枚举,虽然枚举的成员有不同的值?