我正在尝试将结构打包更改为1个字节。我想在makefile中使用C编译器标志来实现它,它应该通过将它们定义为1字节对齐来处理代码中的所有结构。
我试过这个,我可以在代码
中使用它#if (PRAGMA_PACK)
#pragma pack (1)
#endif
typedef PACKED struct _stsomefn
{
}stsomefn;
使用在makefile中设置 PRAGMA_PACK
CDEFS += -DPRAGMA_PACK=1
这当然有效。 这里的问题是我不想改变这段代码。所以这就是为什么我要求在makefile中定义的MACRO做同样的事情。
答案 0 :(得分:4)
使用GCC,填充结构的方法是添加特定于GCC的__attribute__ ((packed))
variable attribute。
如果您希望将其作为宏,只需#define
合适的一个:
#define PACKED __attribute__ ((packed))
然后使用它:
struct my_packed_struct {
int x;
char y;
float z;
} PACKED;
有关packed
属性的详细信息,另请参阅this question。
答案 1 :(得分:2)
您可以使用_Pragma
关键字C99轻松地从宏发出编译指示,gcc可以毫无问题地实现此功能。
#define PACK1 _Pragma("pack(1)")
答案 2 :(得分:2)
我想在makefile中使用MACRO来处理代码中的所有结构。
我不知道这意味着什么,makefile中的宏会如何影响你的代码?您需要在实际代码中使用宏,因此您需要更改代码,您说您不想这样做。
使用GCC,您可以通过以下方式控制包装:
#pragma pack(1)
__attribute__((packed))
-fpack-struct
最后一个适用于makefile,无需更改代码。