如何在编译时输出结构中成员的偏移量(C / C ++)

时间:2013-06-20 15:26:21

标签: c++ c gcc g++

我正在尝试在编译期间输出struct成员的偏移量。我需要知道偏移量,然后我想添加一个#error来确保成员保持相同的偏移量。 我有几种方法可以在VS中看到工作方法,但我使用GCC并且它们无法正常工作。

谢谢!

2 个答案:

答案 0 :(得分:6)

您可以使用offsetof宏以及C ++ 11 static_assert功能,如下所示:

struct A {
     int i;
     double db;
     ...
     unsigned test;
};

void TestOffset() {
     static_assert( offsetof( A, test ) == KNOWN_VALUE, "The offset of the \"test\" variable must be KNOWN_VALUE" );
}

答案 1 :(得分:1)

将此文件放在与main()

相同的文件中
template <bool> struct __static_assert_test;
template <> struct __static_assert_test<true> {};
template <unsigned> struct __static_assert_check {};

#define ASSERT_OFFSETOF(class, member, offset) \
    typedef __static_assert_check<sizeof(__static_assert_test<(offsetof(class, member) == offset)>)> PROBLEM_WITH_ASSERT_OFFSETOF ## __LINE__

并在main()

ASSERT_OFFSETOF(foo, member, 12);

即使您没有C ++ 11,这也应该有效。如果您这样做,则可以将ASSERT_OFFSETOF定义为:

#define ASSERT_OFFSETOF(class, member, offset) \
    static_assert(offsetof(class, member) == offset, "The offset of " #member " is not " #offset "...")