C语言——enum

本文通过C语言代码示例介绍了枚举(enum)和类型定义(typedef)的使用方法,展示了如何定义季节和工作日,并进行了大小计算及条件判断等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>

enum Season
{
    spring, summer=100, fall=96, winter
};


typedef enum
{
    Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}Weekday;

int main(void)
{

    char * files[] = {"f","b","d","g"};

    printf("sizeof files = %d\n",sizeof(files));
    
    printf("sizeof int = %d\n",sizeof(int));
    
    char *p = NULL;
    printf("sizeof p = %d\n",sizeof(p));
    
    /* Season */

    printf("%d \n", spring); // 0

    printf("%d, %c \n", summer, summer); // 100, d

    printf("%d \n", fall+winter); // 193

    enum Season mySeason=winter;

    if(winter==mySeason)

        printf("mySeason is winter \n"); // mySeason is winter

    int x=100;

    if(x == summer)

        printf("x is equal to summer\n"); // x is equal to summer

    printf("%d bytes\n", sizeof(spring)); // 4 bytes

    /* Weekday */

    printf("sizeof Weekday is: %d \n", sizeof(Weekday)); //sizeof Weekday is: 4

    Weekday today = Saturday;

    Weekday tomorrow;

    if(today == Monday)

        tomorrow = Tuesday;

    else

        tomorrow = (Weekday) (today + 1); //remember to convert from int to Weekday
    
    return 0;
}
sizeof files = 16
sizeof int = 4
sizeof p = 4
0
100, d
193
mySeason is winter
x is equal to summer
4 bytes
sizeof Weekday is: 4


Terminated with return code 0
Press any key to continue ...

 

### C语言中使用 `uint16_t` 定义枚举类型 为了确保枚举类型的底层实现使用特定的数据类型,可以采用匿名联合体的方式或者直接指定基础类型。自 C99 起,在某些编译器上可以直接为枚举类型指定基础类型[^1]。 #### 方法一: 使用标准C扩展语法 部分现代编译器支持在定义枚举时显式声明其底层数字类型: ```c #include <stdint.h> typedef enum : uint16_t { ENUM_VALUE_0 = 0, ENUM_VALUE_1, ENUM_VALUE_MAX } MyEnum; ``` 这种方法简洁明了,但是依赖于编译器的支持情况。 #### 方法二: 利用 typedef 和 struct 实现 如果目标平台上的编译器不支持上述特性,则可以通过创建包含单个枚举成员的结构来间接达到目的: ```c #include <stdint.h> #include <stdio.h> // 构建基于 uint16_t 的枚举 typedef struct { uint16_t value; } EnumBase; #define DEFINE_ENUM(NAME, ...) \ typedef union { \ uint16_t raw; \ struct { \ __VA_ARGS__; \ } NAME##_t; \ } NAME DEFINE_ENUM(MyEnum, enum { ENUM_VAL_A = 0, ENUM_VAL_B, ENUM_VAL_C }); void print_enum(MyEnum e) { printf("Value: %u\n", (unsigned)e.raw); } int main() { MyEnum example = (MyEnum){ .raw = ENUM_VAL_B }; print_enum(example); return 0; } ``` 此方案兼容性更好,并且能够有效控制内存布局以及防止意外溢出等问题发生。 #### 方法三: GCC/Clang 特定属性 对于GCC和Clang编译器而言,还可以利用它们特有的功能——即通过应用 `_Pragma` 或者 `-fshort-enums` 编译选项 来影响枚举大小的选择;不过最推荐的做法还是前两种方式之一。 以上三种方法都可以用来解决这个问题,具体选择取决于所使用的工具链和个人偏好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值