я открыл stddef.h
и увидел это:
#if defined _MSC_VER && !defined _CRT_USE_BUILTIN_OFFSETOF
#ifdef __cplusplus
#define offsetof(s,m) ((size_t)&reinterpret_cast<char const volatile&>((((s*)0)->m)))
#else
#define offsetof(s,m) ((size_t)&(((s*)0)->m))
#endif
#else
#define offsetof(s,m) __builtin_offsetof(s,m)
#endif
В филиале __cplusplus
(В случае компилятора C ++) есть очень странная реализация, я думаю, что она избыточна. В другой ветке (в случае компилятора C) более простое вычисление смещения поля. И я проверил это, это работает. Для чего использовались эти странные приведения и классификаторы типов в первом случае?
operator &
может быть перегружен для типа m
, так &((s*)0)->m)
назвал бы это operator &
вместо того, чтобы принимать m
адрес.
А также const volatile
есть ли в reinterpret_cast
типа, чтобы он работал, даже когда m
является const
и / или volatile
,
Обратите внимание, что в C ++ 11 есть std::addressof(x)
который всегда принимает адрес x
невзирая на operator &
Перегрузки. Вероятно, он будет реализован аналогично тому, что вы видите в вопросе.
Других решений пока нет …