簡體   English   中英

如何在編譯時輸出結構中成員的偏移量(C / C ++)

[英]How to output the offset of a member in a struct at compile time (C/C++)

我正在嘗試在編譯時輸出struct成員的偏移量。 我需要知道偏移量,以后我想添加#error以確保成員保持相同的偏移量。 在VS中,我已經看到了幾種方法可以做到這一點,但是我正在使用GCC,但它們無法正常工作。

謝謝!

您可以將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" );
}

將此與您的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 "...")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM