gpt4 book ai didi

c++ - 如何使用 union 成员的大小计算编译时值?

转载 作者:行者123 更新时间:2023-11-30 03:58:49 26 4
gpt4 key购买 nike

考虑以下数据结构:

union LambdaBox {                                                           
struct {
uint64_t full;
char lambda[];
} data;
char padding[64];
};

编译时清楚知道成员变量full的大小。

如何在不先创建 LambdaBox 类型的对象的情况下直接引用它?

更具体地说,我正在尝试编写一个在语义上等同于下面第三条语句的表达式(在编译时求值)。

int main(){
// This works
printf("The total size allowed is %zu\n", 56L);
// This also works
printf("The total size of LambdaBox is %zu\n", sizeof(LambdaBox));

// What is the correct syntax for the semantic meaning of the following line?
printf("The total size allowed is %zu\n", sizeof(LambdaBox) -
sizeof(LambdaBox::data::full);
}

最佳答案

  1. 使用 decltype(C++11 及更高版本):

    sizeof(LambdaBox) - sizeof decltype(LambdaBox::data)::full

    关于大肠杆菌:http://coliru.stacked-crooked.com/a/b566a890b4143838

  2. 您可以通过命名data 的匿名类型来避免对decltype 的需要。

  3. 您可以利用 sizeof 操作数始终为 unevaluated 的事实即使您不能使用 decltype 也可以避免使用临时变量(甚至可以在古老的编译器上使用):

    sizeof(LambdaBox) - sizeof LambdaBox().data.full

    关于大肠杆菌:http://coliru.stacked-crooked.com/a/14bcbd6995c9dd8c

  4. 直接方式:

    sizeof(LambdaBox) - sizeof LambdaBox::data.full

    关于大肠杆菌:http://coliru.stacked-crooked.com/a/f984d8e9462ca2c2

请注意,灵活的数组成员是 C99 的一项功能,即使在 C++14 中也没有(GCC 和 clang 接受它作为扩展)。

关于c++ - 如何使用 union 成员的大小计算编译时值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27256579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com