clang 编译器结构打包 - 始终填充到 2 字节
Short:我无法让我的 clang 编译器将 lwip 中的
packed_struct_test
测试结构打包为 5 个字节。它总是显示 6 字节。
详情: 这是我的测试代码(
lwip/src/core/init.c
的开始部分),我注释掉了原始的lwip定义,以确保它被编译,这是我所需要的。
#ifndef LWIP_SKIP_PACKING_CHECK
#ifdef PACK_STRUCT_USE_INCLUDES
//# include "arch/bpstruct.h"
#endif
// PACK_STRUCT_BEGIN
// struct packed_struct_test {
// PACK_STRUCT_FLD_8(u8_t dummy1);
// PACK_STRUCT_FIELD(u32_t dummy2);
// } PACK_STRUCT_STRUCT;
// PACK_STRUCT_END
struct __attribute__((packed)) packed_struct_test
{
uint8_t dummy1;
uint32_t dummy2;
};
#ifdef PACK_STRUCT_USE_INCLUDES
//# include "arch/epstruct.h"
#endif
#define PACKED_STRUCT_TEST_EXPECTED_SIZE 5
#endif
包装检查在这里完成:
#ifndef LWIP_SKIP_PACKING_CHECK
volatile int temp = sizeof(struct packed_struct_test);
LWIP_ASSERT("Struct packing not implemented correctly. Check your lwIP port.", temp == PACKED_STRUCT_TEST_EXPECTED_SIZE);
#endif
使用调试器我看到 temp 是 6 个字节长。如果我删除
__attribute__((packed))
,则为 8。
我尝试了以下方法:
#pragma pack(1)
(例如此处)-fpack-struct=1
-O0
我的编译器参数看起来像这样(删除了秘密内容):
C:/.conan/3535fc1/1/toolchains/tricore/v9.0.0/bin/clang.exe
-g
-Og
-march=tc162
-fno-common
-ffunction-sections
-fdata-sections
-Wall
-save-temps=obj
-MP
-Wno-parentheses-equality
-I...
-std=c99
-MMD
../....../init.c
-c
-o build-debug/....../init.o
版本:
这是一个最小的可重现示例:
测试.c
struct __attribute__((packed)) packed_struct_test
{
unsigned int dummy2;
unsigned char dummy1;
};
int main() {
volatile int temp = sizeof(struct packed_struct_test);
return 0;
}
构建它
clang.exe -g -O1 -march=tc162 -Wall -fpack-struct=1 -save-temps=obj -MP -std=c99 -MMD test.c -c -o test.o
然后在
mov %d15, 6
行的tests.s中可以看到,结构体大小是6:
.Ltmp0:
.loc 1 9 5 prologue_end # test.c:9:5
mov %d2, 0
.loc 1 8 18 # test.c:8:18
mov %d15, 6
st.w [%a10], 4, %d15
.loc 1 9 5 # test.c:9:5
ret
.Ltmp1:
收到Hightec支持的回复:
您可以使用
或attribute packed
并且结构内部字段不会对齐。 打包结构只有一个限制,即整体结构大小将对齐为 2。pragma pack (1)
似乎编译器故意这样做。