gcc编译器中是否存在用于1字节对齐结构的宏

时间:2013-09-23 08:29:51

标签: c gcc macros makefile

我正在尝试将结构打包更改为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做同样的事情。

3 个答案:

答案 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,无需更改代码。