unsigned long is 32-bit on 32-bit systems and 64-bit on 64-bit systems
on LP64 systems -- which most Unix systems are, but Windows isn't.
Windows is LLP64, which means unsigned long is 32-bit even on 64-bit
systems.
pplwin.h contains
static_assert(alignof(void *) == alignof(::std::once_flag), ...)
which fails due to this problem.
Instead of unsigned long, use uintptr_t, which consistently is 32-bit
on 32-bit systems and 64-bit on 64-bit systems.
Only do this when targeting the Windows ABI or when ABI
stability isn't required, since the type of once_flag::state_ gets
mangled into the exported symbol call_once.
No functional change except on 64-bit Windows.
Did you have to use if defined? Looks like you can always use uintptr_t.