#pragma pack(show) 与 GCC

Posted

技术标签:

【中文标题】#pragma pack(show) 与 GCC【英文标题】:#pragma pack(show) with GCC 【发布时间】:2014-04-29 14:36:36 【问题描述】:

有没有办法用 GCC 显示内存“包”大小?

在 Microsoft Visual C++ 中,我使用的是:

 #pragma pack(show) 

在警告消息中显示该值;见Microsoft's documentation。

GCC 的等价物是什么?

【问题讨论】:

我在the documentation 中没有看到一个。 @Elias:c 标签有什么问题? @LightnessRacesinOrbit:鉴于 OP 来自 VC++,并且也将这个问题标记为 C++,我怀疑他编写的代码是用 C++ 编写的,而不是 C。预处理器应该是相同的,但情况并非总是如此 @EliasVanOotegem:但 OP 显然想了解 C 和 C++,两者的功能是相同的。但是,是的,重要的是要记住 C 和 C++ 是两种不同的语言。 OP:你真的同时使用 C 和 C++ 吗? 这是我认为两个标签都很好的少数情况之一,但是 YMMV :) 【参考方案1】:

由于我在the pertinentdocumentation 中看不到此类功能,因此我将得出结论,GCC 无法做到这一点。

【讨论】:

虽然你不能这样做,也许c++11 offsetof会有所帮助,这取决于具体情况。 en.cppreference.com/w/cpp/types/offsetof 它应该足够好,例如单元测试。 (我从未使用过它,所以我不确定它是否能按预期工作。) @meandbug:是的,可能【参考方案2】:

每当我打包一个结构并想查看它的大小时,我都会使用静态断言。

/*
   The static_assert macro will generate an error at compile-time, if the predicate is false
   but will only work for predicates that are resolvable at compile-time!

   E.g.: to assert the size of a data structure, static_assert(sizeof(struct_t) == 10)
*/
#define STATIC_ASSERT(COND,MSG)      typedef char static_assertion_##MSG[(!!(COND))*2-1]
/* token pasting madness: */
#define COMPILE_TIME_ASSERT3(X,L)     STATIC_ASSERT(X,at_line_##L)             /* add line-number to error message for better warnings, especially GCC will tell the name of the variable as well */
#define COMPILE_TIME_ASSERT2(X,L)     COMPILE_TIME_ASSERT3(X, L)               /* expand line-number */
#define static_assert(X)              COMPILE_TIME_ASSERT2(X, __LINE__)        /* call with line-number macro */

#define PACKED  __attribute__ ((gcc_struct, __packed__))

typedef struct 
  uint8_t bytes[3];
  uint32_t looong;
 PACKED struct_t;
static_assert(sizeof(struct_t) == 7);

这将在静态断言失败时给你一个编译时警告。

【讨论】:

以上是关于#pragma pack(show) 与 GCC的主要内容,如果未能解决你的问题,请参考以下文章

#pragma pack(非常有用的字节对齐用法说明)

高级C__attribute__((aligned(n))) 与 #pragma(pack(n))的区别

高级C__attribute__((aligned(n))) 与 #pragma(pack(n))的区别

#Pragma Pack(n)与内存分配

#pragma pack(push) 和#pragma pack(pop) 以及#pragma pack()

关于结构体内存对齐方式的总结(#pragma pack()和alignas())