查看编译时struct元素的大小?

查看编译时struct元素的大小?,c,struct,sizeof,C,Struct,Sizeof,如何在编译时查看struct元素的大小 我试过: #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?”

如何在编译时查看struct元素的大小

我试过:

#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?”。(这是另一个帖子问的),所以我不认为它是重复的。我问“如何在编译时看到struct元素的大小?这是一个不同的问题。”


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

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

方法1

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

#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);
方法2


假设它已编译,请查看编译器生成的映射文件中的变量,该变量会告诉您它使用了多少字节。

…因此,您只需重新创建一个问题,因为您有太多的下一票?您想要的是不可能的,也没有意义。实际的问题是:为什么您要假设一个
struct
具有16位?您的AB是什么我需要?为什么你依赖它?为什么你认为你可以依赖它?为什么你不干脆
printf(“我的超级重要尺寸是%zu”,我的结构元素的尺寸)
在主体的开头?在你的问题中,你是不尊重的。@DavideAndrea好吧,这显然是一个XY问题……你不想给出结构定义,我们浪费了我们的时间。看看这个,或者看看你的编译器生成的asm,或者告诉我们真正的问题是什么。这不是重复的问题:这个问题问的是编译时间(#pragma消息不是由预处理器执行的,而是在编译过程中执行的),这比另一个问题(预处理器阶段的sizeof)更合理地要求和期望它能够工作。它不应该作为