【问题标题】:See the size of a struct element at compile time? [duplicate]在编译时查看结构元素的大小? [复制]
【发布时间】:2017-05-30 00:04:29
【问题描述】:

如何在编译时查看结构元素的大小?

我试过了:

#define XSTR(x) STR(x)
#define STR(x) #x
#pragma message "Size of struct: " XSTR(sizeof(my_struct.element))

但它只是显示:

note: #pragma message: Size of struct: sizeof(my_struct.element)

我不想断言它的尺寸合适。我想知道尺寸是多少。

编辑:我没有问“我如何使用 sizeof?”。 (这是其他帖子所要求的),所以我不认为它是重复的。我问“如何在编译时查看结构元素的大小?这是一个不同的问题。

我正在尝试解决为什么编译器将 32 位分配给 16 位结构。

【问题讨论】:

  • ...所以你只是重新创建一个问题,因为你有太多的反对票?你想要的东西是不可能的,没有意义的。
  • 实际的问题是:你为什么假设 struct 有 16 位?您的 ABI 需要什么?你为什么依赖它?为什么你认为你可以依赖它?
  • 你为什么不把printf("my super important size is %zu", sizeof my_struct.element);放在主要的开头?在您的问题中,您不尊重。
  • @DavideAndrea 好吧,这显然是一个 XY 问题...您不想给出我们浪费时间的结构定义。请参阅此stackoverflow.com/questions/20979565/… 或查看编译器生成的 asm 或告诉我们真正的问题是什么。
  • 它不是重复的:这个问题询问编译时间(#pragma 消息不是由预处理器执行,而是在编译期间执行),这是更合理的要求和期望比其他问题(预处理器阶段的sizeof)更有效。它不应该作为 stackoverflow.com/questions/4079243/… 的副本关闭

标签: c struct sizeof


【解决方案1】:

我很遗憾地说,我只能想出以下丑陋的蛮力方法。但他们工作。

方法一

在与大小对应的行处编译失败。通过检查哪一行失败,我知道了结构元素的大小

#define STATIC_ASSERT_SIZE(an_item, a_siz) do { enum { dummy_var = 1/((an_item == a_siz)? 0 : 1 )}; } while (0)

STATIC_ASSERT_SIZE(sizeof(my_struct.element), 0);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 1);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 2);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 3);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 4);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 5);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 6);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 7);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 8);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 9);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 10);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 11);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 12);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 13);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 14);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 15);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 16);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 17);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 18);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 19);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 20);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 21);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 22);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 23);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 24);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 25);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 26);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 27);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 28);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 29);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 31);
STATIC_ASSERT_SIZE(sizeof(my_struct.element), 32);

方法二

假设它可以编译,看看编译器生成的 MAP 文件中的变量,它告诉你它使用了多少字节。

【讨论】:

    猜你喜欢
    • 2013-10-24
    • 2019-05-09
    • 2023-03-12
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多