Кроссплатформенная версия __PTRDIFF_TYPE__

Есть ли кроссплатформенный способ определить, ptrdiff_t такой же как long или же long long во время предварительной обработки?

я знаю __PTRDIFF_TYPE__ должен давать тип с помощью gcc / g ++, но он не определен в VC/VC++ для Windows. Есть ли лучший подход, чем следующий?

#ifndef __PTRDIFF_TYPE__
# if _WIN64
#  define __PTRDIFF_TYPE__ long long
# else
#  define __PTRDIFF_TYPE__ long
# endif
#endif

Если это невозможно во время предварительной обработки, есть ли подход времени компиляции? Я ищу решение не на C++11, но если у вас есть действительно хорошее современное решение, не стесняйтесь поделиться!

1 ответ

Решение

Подход во время компиляции очень очевиден:

if (sizeof(ptrdiff_t) == sizeof(long))

или же

if (sizeof(ptrdiff_t) == sizeof(long long))

TMK, для этого нет переносимых определений. Однако это всего лишь незначительное препятствие. С помощью всего лишь небольшого количества сценариев любой тест во время компиляции такого типа может быть тривиально преобразован в тест на основе препроцессора с использованием стандартных инструментов, таких как autoconf и automake. Это стандартные инструменты, используемые тысячами бесплатных библиотек и инструментов для этой конкретной цели.

Другие вопросы по тегам