Tag: 枚举

if语句中的枚举比较在c中永远不是真的

我正在ansi C开发一个程序,我有一些问题。 我有一个enum enum day { Monday = ‘M’, Tuesday = ‘T’, Wednesday = ‘W’ } 和days 2d array days typedef enum day availDays[numOfWeeks][daysOfWeek]; memset(theArray, Monday, sizeof(theArray)); 后来在if语句中使用,如下所示: if ( theArray[0][0] == Monday ) { foo statements; } 但即使数组的每个元素都是Monday ,这个条件永远不会计算为true ,任何想法为什么?

我应该使用什么类型的C enum的二进制表示?

我知道C enum是无符号整数,但这可能因实现而异。 我应该在二进制表示中使用什么类型的枚举? * PS’二进制表示’表示字节数组。 我想将枚举值序列化为socket以与其他程序进行交互操作。

是什么导致“警告:条件表达式中的指针/整数类型不匹配”?

我有一个枚举,一个宏定义和一个所有使用枚举的方法。 我无法编译。 请考虑以下代码段。 typedef enum fruits_t { APPLE, ORANGE, BANANA } fruits_t; #define KEY_TO_VALUE(x) ((x == APPLE) ? 0 : \ (x == ORANGE) ? 1 : \ (x == BANANA) ? 2 : \ “Undefined”) static void foo(char fruit) { if (fruit == KEY_TO_VALUE(APPLE)) { /* do something */ } } 编译,但我得到以下警告。 warning: pointer/integer […]

在C中进行文本查找的通用枚举

[更新] 给出的代码确实有效。 当我认为它没有时,我错了。 我的错; 遗憾++。 如果您可以改进代码,请访问https://codereview.stackexchange.com/questions/150480/generic-enum-to-text-lookup-in-c 我们必须在编译时声明我们的字符串。 我们对嵌入式系统进行编码,不允许使用malloc() 。 很抱歉没有这么清楚。 [更新++]我可能会接受下面的答案之一。 然而,我忘了说,我们的枚举是不连续的,并且范围很广,这可以有所作为 intertubes和这个网站充斥着要求从枚举中获取文本的问题。 我找不到一个规范的方法来做这个(并且会接受一个作为这个问题的答案),所以让我们看看我们是否可以在我们之间拼凑一个。 在我们的代码中,我们有多个结构数组,包含枚举对应和相应的字符串。 问题是字符串具有不同的长度,因此我们为每个字符串编写一个查找函数,用于在结构数组上循环,尝试匹配枚举并在找到匹配时返回相应的文本。 让我们采取以下两个人为的例子: // +=+=+=+=+=+=+=+=+=+=+=+=+=+= typedef enum { north, south, east, west } E_directions; struct direction_datum { E_directions direction; char direction_name[6]; }; struct direction_datum direction_data[] = { {north, “north”}, {south, “south”}, {east, “east”}, {west, “west”}, }; // +=+=+=+=+=+=+=+=+=+=+=+=+=+= typedef enum { […]

如何在ANSI C中的结构中使用枚举?

以下代码必须在main-function中使用,但我不知道它是如何使用的。 struct SomeItem { enum {MOVIE, MUSIC} itemType; union { struct Movie* movie; struct Music* music; }; }; 这个结构用在带有previous / item / next指针的动态链表中,但我不知道如何设置枚举。 或者如何初始化它。 我需要知道它在main函数中的样子。 biglist.someitem = ???; /* declaration I use */ struct Library* biglist; 更多代码,以了解我想做什么。 struct Library{ struct SomeItem* someitem; struct SomeItem* previousItem; struct SomeItem* nextItem; }; 编译器错误:C2037:’someitem’左侧指定未定义的struct / union’library’C2065:MOVIE:未声明的标识符 我仍然是ANSI C的新手,所以不要拍我好;)

C – 枚举的前向声明?

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

枚举是否永远不会在API中使用?

我正在使用提供给我的C库。 我在编译库时使用的编译器,版本,选项等信息有限。 库接口在传递的结构中使用enum ,并直接作为传递的参数使用。 问题是:当我编译代码以使用提供的库时,我如何保证或确定我的编译器将使用相同大小的enum ? 如果没有,则结构将不会排列,并且参数传递可能会混乱,例如long与int 。 我的担忧源于C99标准,该标准规定了enum类型: 应与char,有符号整数类型或无符号整数类型兼容。 类型的选择是实现定义的,但应能够表示枚举的所有成员的值。 据我所知,只要最大值适合,编译器就可以选择任何类型,它非常随意,有效地随心所欲,不仅可能在编译器之间变化,而且可能在同一编译器和/或编译器选项的不同版本之间变化。 它可以选择1,2,4或8字节表示,从而导致结构和参数传递中的潜在不兼容性。 (它也可以选择签名或未签名,但我没有看到在这种情况下出现问题的机制。) 我在这里错过了什么吗? 如果我没有遗漏某些内容,这是否意味着永远不应该在API中使用enum ? 更新: 是的,我错过了什么。 虽然语言规范在这里没有帮助,但正如@Barmar所指出的应用程序二进制接口(ABI)所做的那样。 或者如果没有,则ABI不足。 我系统的ABI确实指定enum必须是带符号的四字节整数。 如果编译器不服从,那就是一个bug。 给定完整的ABI和兼容编译器, enum 可以在API中安全使用。

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

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

在C中使用枚举而不是#defines用于编译时常量是否合理?

在使用C ++一段时间后,我回到了一些C开发阶段。 我已经明白,如果没有必要支持让编译器在编译时为你做更多工作,应该避免使用宏。 因此,对于常量值,在C ++中我会使用静态const变量,或者使用C ++ 11枚举类来实现优秀的范围。 在C中,静态常量不是真正的编译时常量,枚举可能(?或可能不?)的行为略有不同。 那么,更喜欢使用枚举作为常量而不是#defines是否合理? 作为参考,这里有一个很好的列表,包括枚举,#define和C ++中的静态consts 。

C bitflag枚举应该如何转换为C ++?

C ++主要是C的超集,但并非总是如此。 特别是,虽然C和C ++中的枚举值都隐式转换为int,但反之则不然:只有在C中,int会转换回枚举值。 因此,通过枚举声明定义的bitflags无法正常工作。 因此,这在C中是可以的,但在C ++中则不行: typedef enum Foo { Foo_First = 1<<0, Foo_Second = 1<<1, } Foo; int main(void) { Foo x = Foo_First | Foo_Second; // error in C++ return 0; } 如何有效和正确地处理这个问题,理想情况下不会损害使用Foo作为变量类型的调试器友好性质(它会分解成手表中的组件位标志等)? 还要考虑可能有数百个这样的标志枚举,以及数千个使用点。 理想情况下,某种有效的运算符重载可以解决问题,但它确实应该是高效的; 我想到的应用程序是受计算限制的,并且具有快速的声誉。 澄清:我正在将一个大型(> 300K)的C程序翻译成C ++,所以我在运行时和开发人员时间都在寻找有效的翻译。 只需在所有适当的位置插入演员阵容可能需要数周时间。