You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取enum的位范围或struct bit field的位大小?

如何获取结构体位域的位大小或枚举的位范围?

想要获取结构体中位域的实际位大小,或是枚举类型的最小所需位范围(比如示例中Bar的成员最大值为7,需要3位),但使用基于sizeof的通用方法无法得到预期结果:

#include <climits>
#include <iostream>
#include <utility>

template <typename T>
auto bitsizeof() {
    return sizeof(T) * CHAR_BIT;
}

struct Foo {
    unsigned vi : 6;
};

enum Bar { zero = 0, seven = 7 }; // 所需位范围为3位

int main() {
    std::cout << "char is        " << bitsizeof<char>() << "\n";
    std::cout << "int is         " << bitsizeof<int>() << "\n";
    std::cout << "long double is " << bitsizeof<long double>() << "\n";

    // 结果不符合预期
    std::cout << "Foo::vi is     " << bitsizeof<decltype(std::declval<Foo>().vi)>() << " (预期为6)\n";

    // 结果不符合预期
    std::cout << "Bar is         " << bitsizeof<Bar>() << " (预期为3)\n";
}

程序输出:

char is        8
int is         32
long double is 128
Foo::vi is     32 (预期为6)
Bar is         32 (预期为3)

目前只能通过手动计算后硬编码的方式临时解决,比如:

constexpr std::size_t Bar_bitsize = 3;
constexpr std::size_t Foo_vi_bitsize = 6;

但这种方式不够健壮,一旦位域或枚举成员修改,硬编码的值容易遗漏更新。

补充说明:
在C++(区别于C)中,未指定底层存储类型的枚举,其位范围由枚举成员的取值决定,若将枚举变量设置为超出该位范围的值,属于未定义行为。

内容的提问来源于stack exchange,提问作者Eljay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:35:23