0

我正在尝试将结构打包更改为 1 个字节。我想在makefile中使用C编译器标志来做到这一点,它应该通过将它们定义为1字节对齐来处理代码中的所有结构。

我已经尝试过了,我可以在代码中使用它来做这件事

#if (PRAGMA_PACK)
#pragma pack (1)
#endif
typedef PACKED struct _stsomefn
{

}stsomefn;

PRAGMA_PACK在makefile中使用

CDEFS += -DPRAGMA_PACK=1

这已经奏效了,当然会。这里的问题是我不想更改此代码。所以这就是为什么我要求一个将在makefile中定义的宏来做同样的事情。

4

3 回答 3

4

使用 GCC,使结构打包的方法是添加 GCC 特定的变量属性__attribute__ ((packed))

如果你想把它作为一个宏,只要#define一个合适的:

#define PACKED __attribute__ ((packed))

然后使用它:

struct my_packed_struct {
  int x;
  char y;
  float z;
} PACKED;

有关该属性的更多详细信息,另请参阅此问题。packed

于 2013-09-23T08:33:26.077 回答
2

您可以使用 C99 关键字轻松地从宏发出 pragma _Pragma,gcc 毫无问题地实现了这一点。

#define PACK1 _Pragma("pack(1)")
于 2013-09-23T08:40:25.737 回答
2

我想在 makefile 中使用 MACRO 来处理代码中的所有结构。

我不知道这意味着什么,makefile 中的宏将如何影响您的代码?您需要在实际代码中 使用宏,因此您需要更改代码,您说您不想这样做。

使用 GCC,您可以通过以下方式控制打包:

  • #pragma pack(1)在源代码中
  • __attribute__((packed))关于结构和变量定义
  • -fpack-struct在命令行上

最后一个适合在makefile中使用,无需更改代码。

于 2013-09-23T08:47:21.053 回答