如何在不使用宏定义或const字段的情况下获取结构体中数组的元素个数?
在标准C中不借助自定义宏或const字段计算结构体数组的元素个数
你贴的这段代码就是标准C里可行的解决方案,但有个关键前提:数组必须是结构体的最后一个成员,具体原理和细节如下:
核心逻辑
通过结构体总大小减去数组成员的起始偏移量,得到数组的总字节占用,再除以单个元素的大小,就能算出元素个数:
offsetof(TEXTUREBUCKET, vtx):获取数组vtx在结构体中的起始偏移字节数,也就是vtx之前所有成员(tpage、nVtx)的总大小sizeof(TEXTUREBUCKET):整个结构体的总字节大小,减去偏移量后得到的就是数组vtx占用的总字节数- 除以
sizeof(D3DTLBUMPVERTEX):单个数组元素的大小,最终得到元素个数
完整代码示例
#include <stddef.h> // 必须包含该头文件才能使用offsetof #include <stdint.h> // 示例定义D3DTLBUMPVERTEX,实际请替换为你的真实类型 typedef struct { float x, y, z; uint32_t diffuse; } D3DTLBUMPVERTEX; typedef struct TEXTUREBUCKET { long tpage; long nVtx; D3DTLBUMPVERTEX vtx[2048]; } TEXTUREBUCKET; static inline size_t TextureBucketVertexCount() { // 仅当vtx是结构体最后一个成员时有效 return (sizeof(TEXTUREBUCKET) - offsetof(TEXTUREBUCKET, vtx)) / sizeof(D3DTLBUMPVERTEX); }
重要注意事项
- 这个方法仅适用于数组是结构体最后一个成员的场景:如果数组后面还有其他结构体成员,
sizeof(TEXTUREBUCKET)会包含后续成员的大小,计算结果会完全错误 - 必须包含
<stddef.h>头文件,offsetof是标准库提供的宏,不属于自定义宏,符合你“不借助宏定义”的要求
内容的提问来源于stack exchange,提问作者user3001150
相关产品推荐
相关产品推荐

