Почему смещение реализаций странным образом отличается на C и C ++?

я открыл 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) более простое вычисление смещения поля. И я проверил это, это работает. Для чего использовались эти странные приведения и классификаторы типов в первом случае?

4

Решение

operator & может быть перегружен для типа m, так &((s*)0)->m) назвал бы это operator & вместо того, чтобы принимать mадрес.

А также const volatile есть ли в reinterpret_castтипа, чтобы он работал, даже когда m является const и / или volatile,

Обратите внимание, что в C ++ 11 есть std::addressof(x) который всегда принимает адрес x невзирая на operator & Перегрузки. Вероятно, он будет реализован аналогично тому, что вы видите в вопросе.

10

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]