VirtualBox

Changeset 30240 in vbox for trunk/include


Ignore:
Timestamp:
Jun 16, 2010 12:33:33 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
62735
Message:

iprt/assert.h: Added AssertCompileMembersAtSameOffset, AssertCompileMembersSameSize and AssertCompileMembersSameSizeAndOffset + testcase.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/assert.h

    r28800 r30240  
    273273#endif
    274274
     275/** @def RTASSERT_HAVE_STATIC_ASSERT
     276 * Indicates that the compiler implements static_assert(expr, msg).
     277 * @todo Does any GCC version support static_assert?
     278 */
     279#ifdef _MSC_VER
     280# if _MSC_VER >= 1600 && defined(__cplusplus)
     281#  define RTASSERT_HAVE_STATIC_ASSERT
     282# endif
     283#endif
     284#ifdef DOXYGEN_RUNNING
     285# define RTASSERT_HAVE_STATIC_ASSERT
     286#endif
     287
    275288/** @def AssertCompile
    276289 * Asserts that a compile-time expression is true. If it's not break the build.
    277290 * @param   expr    Expression which should be true.
    278291 */
    279 #ifdef __GNUC__
     292#ifdef RTASSERT_HAVE_STATIC_ASSERT
     293# define AssertCompile(expr)    static_assert(!!(expr), #expr)
     294#elif defined(__GNUC__)
    280295# define AssertCompile(expr)    extern int RTASSERTVAR[1] __attribute__((unused)), RTASSERTVAR[(expr) ? 1 : 0] __attribute__((unused))
    281296#else
     
    393408#endif
    394409
     410/** @def AssertCompileMembersAtSameOffset
     411 * Asserts that members of two different structures are at the same offset.
     412 * @param   type1   The first type.
     413 * @param   member1 The first member.
     414 * @param   type2   The second type.
     415 * @param   member2 The second member.
     416 */
     417#if defined(__GNUC__)
     418# if __GNUC__ >= 4
     419#  define AssertCompileMembersAtSameOffset(type1, member1, type2, member2) \
     420    AssertCompile(__builtin_offsetof(type1, member1) == __builtin_offsetof(type2, member2))
     421# else
     422#  define AssertCompileMembersAtSameOffset(type1, member1, type2, member2) \
     423    AssertCompile(RT_OFFSETOF(type1, member1) == RT_OFFSETOF(type2, member2))
     424# endif
     425#else
     426# define AssertCompileMembersAtSameOffset(type, member1, member2) \
     427    AssertCompile(RT_OFFSETOF(type1, member1) == RT_OFFSETOF(type2, member2))
     428#endif
     429
     430/** @def AssertCompileMembersSameSize
     431 * Asserts that members of two different structures have the same size.
     432 * @param   type1   The first type.
     433 * @param   member1 The first member.
     434 * @param   type2   The second type.
     435 * @param   member2 The second member.
     436 */
     437#define AssertCompileMembersSameSize(type1, member1, type2, member2) \
     438    AssertCompile(RT_SIZEOFMEMB(type1, member1) == RT_SIZEOFMEMB(type2, member2))
     439
     440/** @def AssertCompileMembersSameSizeAndOffset
     441 * Asserts that members of two different structures have the same size and are
     442 * at the same offset.
     443 * @param   type1   The first type.
     444 * @param   member1 The first member.
     445 * @param   type2   The second type.
     446 * @param   member2 The second member.
     447 */
     448#if defined(__GNUC__)
     449# if __GNUC__ >= 4
     450#  define AssertCompileMembersSameSizeAndOffset(type1, member1, type2, member2) \
     451    AssertCompile(__builtin_offsetof(type1, member1) == __builtin_offsetof(type2, member2) && RT_SIZEOFMEMB(type1, member1) == RT_SIZEOFMEMB(type2, member2))
     452# else
     453#  define AssertCompileMembersSameSizeAndOffset(type1, member1, type2, member2) \
     454    AssertCompile(RT_OFFSETOF(type1, member1) == RT_OFFSETOF(type2, member2) && RT_SIZEOFMEMB(type1, member1) == RT_SIZEOFMEMB(type2, member2))
     455# endif
     456#else
     457# define AssertCompileMembersSameSizeAndOffset(type, member1, member2) \
     458    AssertCompile(RT_OFFSETOF(type1, member1) == RT_OFFSETOF(type2, member2) && RT_SIZEOFMEMB(type1, member1) == RT_SIZEOFMEMB(type2, member2))
     459#endif
     460
    395461/** @} */
    396462
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette