Где определить, существует ли длинный длинный тип? Я хочу сделать что-то вроде этого:Долго ли определено?
#ifdef LONGLONG
#define long_long long long
#else
#define long_long long
#endif
Где определить, существует ли длинный длинный тип? Я хочу сделать что-то вроде этого:Долго ли определено?
#ifdef LONGLONG
#define long_long long long
#else
#define long_long long
#endif
LLONG_MAX
дает максимальное представимое значение на long long
; если ваша реализация не поддерживает long long
, она не должна определять LLONG_MAX
.
#include <limits.h>
#ifdef LLONG_MAX
#define long_long long long
#else
#define long_long long
#endif
Это не идеальное решение. long long
не является стандартным в C++ 03, а long long
был дольше, чем C99, поэтому возможно (и, вероятно), что компилятор может поддерживать long long
, но не определяет LLONG_MAX
.
Если вам нужен целочисленный тип с определенным размером, вы должны использовать <stdint.h>
, если его реализация поддерживает его. Если ваша реализация не поддерживает его, Boost has an implementation of it.
Чтобы не беспокоиться о том, определен ли тип с этим именем, я бы #include <climits>
и проверить, можно ли найти целочисленный тип, достаточно большой для вашего предполагаемого использования. (Хотя вы, вероятно, просто проверить, если LLONG_MAX
определяется, чтобы выяснить, существует long long
.)
Edit: Или, если вы можете предположить, C99 заголовки и типы должны быть доступны, #include <cstdint.h>
и использовать, например, int64_t
, чтобы получить 64-разрядный тип или int_fast64_t
, чтобы получить «быстрый» 64-разрядный тип (по определенному определению быстрого компилятора). Или intmax_t
, если вы хотите самый большой доступный тип.
@James моя реализация поддерживает (обеспечивает) stdint.h, я нашел там что-то вроде этого: #define _LONGLONG \t __int64, поэтому я понимаю, что я наберу _LONGLONG вместо LLONG_MAX, и все должно быть в порядке? Очень ценю, если бы вы могли ответить на это. Спасибо. –
@ Знание: почему бы просто не использовать типы, определенные в stdint.h? '_LONGLONG' определяется вашей реализацией и не является стандартным, поэтому, если вы хотите написать переносимый код, вы не должны его использовать. –
@James McNellis Я нашел там (stdint.h) что-то вроде этого: UINT64_MAX, если я использую это, я думаю, что все будет хорошо? –