#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的主要内容,如果未能解决你的问题,请参考以下文章
高级C__attribute__((aligned(n))) 与 #pragma(pack(n))的区别
高级C__attribute__((aligned(n))) 与 #pragma(pack(n))的区别