SIZEOF宏,弥补sizeof不足

本文介绍了一种在C/C++中使用宏定义来获取结构体成员大小的方法。通过定义SIZEOF宏,可以在不创建对象的情况下计算结构体成员的实际大小,这对于内存管理和布局分析非常有用。

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

POD

struct Data

{

    int a;

    int b[32];

    char c[128];

};

C/C++不能够支持如下的语法:sizeof(Data::a); sizeof(Data::b); sizeof(Data::c[0]), sizeof必须要有存在的对象,才可以进行操作,这个不好

仿照offsetof宏,定义一个SIZEOF宏:#define SIZEOF(s,m) sizeof(((s *)0)->m)

VC6下可以工作,其他环境不知

 

#define SIZEOF(s,m) sizeof(((s *)0)->m)

struct Data

{

    int a;

    int  b[32];

    char c[128];

};

 

int main(int argc, char* argv[])

{

    int z = 0;

    z = SIZEOF(Data, a);    //---- 4

    z = SIZEOF(Data, b);//---- 128

    z = SIZEOF(Data, c);//---- 128

    z = SIZEOF(Data, b[0]);//---- 4

    z = SIZEOF(Data, c[0]);//---- 1

    return 1;

}

 

0指针用来在不生成对象的情况下计算结构体成员的偏移是个很好的应用

### 关于 `sizeof` 操作符与定义 #### `sizeof` 操作符简介 `sizeof` 是 C 和 C++ 中的一个单目操作符,用于查询数据类型的大小(以字节为单位)。此操作符可以应用于基本数据类型、指针以及复合结构体等。 #### 定义的作用 定义通过预处理器实现,在编译前替换指定的标记或表达式。这使得代码更加灵活和易于维护。可以在编译期间执行简单的计算或字符串拼接[^1]。 #### 结合使用 `sizeof` 与定义 当两者一起工作时,可以通过创建特定用途的来简化复杂度较高的尺寸测量任务。下面展示如何利用定义封装 `sizeof` 的应用: ```c #define BUFFER_SIZE sizeof(array)/sizeof(*array) // 或者更通用的形式 #define ARRAY_LENGTH(x) (sizeof(x)/sizeof((x)[0])) ``` 上述例子展示了两种方式去获取数组长度的方法。第一个版本适用于已知名称的具体数组;第二个则更为泛化,能够处理任意给定的一维数组参数[^3]。 对于动态分配的对象而言,则无法直接运用这种方法求解其实际占用空间量级,因为此时对象并不具备静态存储期属性。因此在这种情况下应当考虑其他手段比如记录申请资源时所传入的相关参数值作为参照依据。 另外值得注意的是,由于是在编译阶段被解析并替代掉相应位置上的原始文本串,所以如果涉及到复杂的逻辑判断或是多条语句构成的操作序列的话就不太适合采用这种方式了——应该转而寻求内联函数之类的解决方案[^2]。 #### 示例代码片段 这里给出一段综合性的示范代码,它不仅体现了前面提到的内容而且还引入了一个条件编译指令以便更好地控制不同平台下的行为差异: ```cpp #include <iostream> #ifdef _WIN32 #pragma message ("Compiling on Windows") #else #pragma message ("Not compiling on Windows") #endif #define PRINT_TYPE_SIZE(type_name)\ std::cout << "Size of "#type_name": "<< sizeof(type_name)<<'\n'; int main(){ int myInt; char* strPtr; PRINT_TYPE_SIZE(int); PRINT_TYPE_SIZE(char*); } ``` 这段程序会打印出整型变量(`int`)和字符指针(`char *`)各自占据多少个字节的空间,并且根据操作系统环境显示不同的编译提示信息[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值