sizeof(enum_type)

博客围绕C/C++面试要点展开,提及防止头文件重复定义的方法,即使用#ifndef、#def、#enddef,还强调野指针free后要置为NULL。同时详细探讨了枚举类型的sizeof计算,对比了C和C++中枚举器类型的差异,并给出不同枚举示例下的范围及sizeof情况。

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

面试时候碰到。还有就是如何防止头文件重复定义,用
#ifndef
#def
#enddef
野指针,free后再置为NULL。

sizeof(enum_type)
C++标准p692:
In C++,the type of an enumerator is its enumeration. In C,tye type of an enumerator is int.
   enum e{A};
   sizeof(A)==sizeof(int)   //in C
   sizeof(A)==sizeof(e)    //In C++
   /*and sizeof(int) is not nessary equal to sizeof(e) */

  那么怎么计算enumerator的sizeof?
the c++ programming language 3rd edition 4.8
The range of an enumeration holds all the enumeration’s enumerator values rounded up to the nearest larger binary power minus 1. The range goes down to 0 if the smallest enumerator is nonnegative and to the nearest lesser negative binary power if the smallest enumerator is negative. This defines the smallest bitfield capable of holding the enumerator values. For example:
   enum e1 { dark, light}; / / range 0:1
   enum e2 { a = 3, b = 9}; / / range 0:15
   enum e3 {min= 10, max = 1000000 }; / / range 1048576:1048575


The sizeof an enumeration is the sizeof some integral type that can hold its range and not larger than sizeof(int), unless an enumerator cannot be represented as an int or as an unsigned int. For example, sizeof(e1) could be 1 or maybe 4 but not 8 on a machine where sizeof(int)==4.
volcano_gpio_config.h:47:99: error: expected unqualified-id before '<' token | cc1plus: all warnings being treated as errors 头文件如下: /****************************************************************************** * Copyright (c) 2025 MeiG Smart Co.Ltd. All Rights Reserved. * * This program is the confidential and proprietary information of MeiG * Smart Co.Ltd. ("Confidential Information"). You shall not disclose such * Confidential Information and shall use it only in accordance with the terms * of the license agreement you entered into with MeiG Smart Co.Ltd. * * Filename: volcano_gpio_config.h * * Description: * Meig c-GPIO API. * * Version: 1.0 * Date: 2025-06-03 * Author: zhanghong * * 1.0 2025-06-03 zhanghong First version ******************************************************************************/ #include <cstdint> #include <cstddef> #ifndef __VOLCANO_GPIO_CONFIG_H__ #define __VOLCANO_GPIO_CONFIG_H__ #ifdef __cplusplus extern "C" { #endif #define MODULE_MCU 379 #define MODULE_PM 357 #define VOLCANO_PIN( pin_number, name, type, gpio_number) PINNAME_##name = pin_number, typedef enum { /*Invalid*/ PINNAME_BEGIN = -1, /*VOLCANO_PIN( pin name, name, type, gpio )*/ VOLCANO_PIN( 59, BT_UART_TXD, MODULE_MCU, 54 ) VOLCANO_PIN( 61, BT_UART_RTS, MODULE_MCU, 52 ) VOLCANO_PIN( 62, BT_UART_CTS, MODULE_MCU, 53 ) VOLCANO_PIN( 63, BT_UART_RXD, MODULE_MCU, 55 ) VOLCANO_PIN( 71, UART1_CTS, MODULE_MCU, 117 ) VOLCANO_PIN( 74, UART1_RTS, MODULE_MCU, 116 ) VOLCANO_PIN( 100, GPIO1, MODULE_MCU, 129 ) //volcano_lpm has already been used VOLCANO_PIN( 102, GPIO3, MODULE_MCU, 126 ) VOLCANO_PIN( 104, GPIO4, MODULE_MCU, 128 ) VOLCANO_PIN( 181, RESERVED_1, MODULE_MCU, 50 ) VOLCANO_PIN( 249, GPIO8, MODULE_MCU, 75 ) VOLCANO_PIN( 280, GPIO9, MODULE_MCU, 103 ) VOLCANO_PIN( 283, GPIO10, MODULE_MCU, 78 ) VOLCANO_PIN( 297, UART3_RX, MODULE_MCU, 65 ) VOLCANO_PIN( 298, UART3_TX, MODULE_MCU, 64 ) PINNAME_END } ENUM_PINNAME; enum { RES_OK = 0,//Execute success RES_ERR_EXEC = -1,//Execute error RES_IO_NOT_SUPPORT = -2,//gpio not support RES_IO_ERROR = -3,//gpio err RES_NOT_IMPLEMENTED = -4,//setting invalible RES_BAD_PARAMETER = -6, //Params bad RES_FUN_NOT_SUPPORT = -9 //not support function }; typedef enum { EINT_SENSE_NONE, /* none */ EINT_SENSE_RISING, /** rising */ EINT_SENSE_FALLING, /** falling */ EINT_SENSE_BOTH /** both */ } ENUM_EINT_TYPE; typedef enum { PINDIRECTION_IN = 0, /** GPIO input direction */ PINDIRECTION_OUT = 1 /** GPIO output direction */ } ENUM_PIN_DIRECTION; typedef enum { PINLEVEL_LOW = 0, /** GPIO low level */ PINLEVEL_HIGH = 1 /** GPIO high level */ } ENUM_PIN_LEVEL; typedef enum { PINPULLSEL_DISABLE = 0, /** Disable pull selection */ PINPULLSEL_PULLDOWN = 1, /**pull down */ PINPULLSEL_PULLUP = 3 /**pull up */ } ENUM_PIN_PULLSEL; typedef enum { PINAWAKE_DISABLE = 0, /** GPIO awake disable */ PINAWAKE_ENABLE = 1 /** GPIO awake enable */ } ENUM_PIN_AWAKE; typedef enum { VOLCANO_GPIO_CB_TYPE_EINT1, // GPIO 中断回调1 VOLCANO_GPIO_CB_TYPE_EINT2, // GPIO 中断回调2 VOLCANO_GPIO_CB_TYPE_MAX }VOLCANO_GPIO_CB_TYPE_E; typedef void (* volcano_ms_eint_callback )( ENUM_PINNAME eint_pin_name, int level ); typedef void (* volcano_ms_eint2_callback )( ENUM_PINNAME eint_pin_name, int level ); #define GPIO_LEVEL_HIGH "1" #define GPIO_LEVEL_LOW "0" #define GPIO_DIR_OUT "out" #define GPIO_DIR_IN "in" #define GPIO_EDGE_NONE "none" #define GPIO_EDGE_BOTH "both" #define GPIO_EDGE_RISING "rising" #define GPIO_EDGE_FALLING "falling" #define SYSFS_GPIO_EXPORT "/sys/class/gpio/export" #define SYSFS_GPIO_UNEXPORT "/sys/class/gpio/unexport" #define DEVICE_NAME "/dev/config-gpio" #define SYSFS_STR(x) #x #define SYSFS_GPIO_STR(x) SYSFS_STR(x) #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) #define GPIO_GET_IRQ 0x3025 #define GPIO_REQUEST 0x3026 #define GPIO_SET_DIR_VALUE 0x3027 #define GPIO_GET_VALUE 0x3028 #define GPIO_SET_VALUE 0x3029 #define GPIO_FREE 0x302A #define GPIO_TO_IRQ 0x302B #define GPIO_FREE_IRQ 0x302C #define GPIO_TO_WAKE 0x302D #define GPIO_GET_WAKE 0x302E #define GPIO_GET_DIR_VALUE 0x302F //#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) //#define SYSFS_GPIO_EXPORT "/sys/class/gpio/export" struct some_ioctl_data { unsigned int value; int ret_val; unsigned int use_data; }; typedef struct { int pin; int Gpio_InitNum; volcano_ms_eint_callback callback; unsigned int irq_num; }Gpio_str; typedef struct { Gpio_str Gpio_Init[132]; int ReqNum; }Gpio_Status; typedef struct { int pinname; int pinnumber; bool initflag; } volcano_pin_driver_typeDef; static volcano_pin_driver_typeDef volcano_pin_table_gpio[] = { {59, MODULE_MCU+54,false}, {61, MODULE_MCU+52,false}, {62, MODULE_MCU+53,false}, {63, MODULE_MCU+55,false}, {71, MODULE_MCU+117,false}, {74, MODULE_MCU+116,false}, {100, MODULE_MCU+129,false}, {102, MODULE_MCU+126,false}, {104, MODULE_MCU+128,false}, {181, MODULE_MCU+50,false}, {249, MODULE_MCU+75,false}, {280, MODULE_MCU+103,false}, {283, MODULE_MCU+78,false}, {297, MODULE_MCU+65,false}, {298, MODULE_MCU+64,false}, {507, MODULE_MCU+48,false}, {508, MODULE_MCU+49,false} }; #ifdef __cplusplus } #endif #endif // __VOLCANO_V2X_CONFIG_H__
最新发布
07-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值