Q:

What is the difference between these two offsetof macros?

I saw these two macros of offsetof: 
#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

What it the difference between :
((size_t)&reinterpret_cast<char const volatile&>((((s*)0)->m)))

and :
((size_t)&(((s*)0)->m)) ? 

A:

operator& can be overloaded in C++. If there is a user defined overload for operator&(const M&), where M is decltype((s*)0)->m) (i.e. the type of the member) and if the overload does not return the address of the object, then the macro without the reinterpret cast would not behave correctly.
char reference is probably used specifically because char and unsigned char have special guarantees about being allowed to alias any type and because operators cannot be overloaded for primitive types. const volatile qualifiers are there probably so that the compiler does not issue a warning about casting away those qualifiers if the member happens to have them.
As T.C pointed out in a comment, the extra cast is probably there to protect against user defined overloads. C does not have overloading, so the protective cast is not necessary.

