Я пытаюсь перенести мой офисный код с C ++ на C ++ 11, и мы интенсивно используем STLPorts.
Есть макрос компилятора (http://www.stlport.org/doc/configure.html) — _STLP_LONG_LONG, который используется в нашем коде и отлично работает в C ++.
Однако в C ++ 11 это не определено.
#if defined (_STLP_LONG_LONG)
// Doesn't come here
Как я могу это исправить? Я пытался искать в Интернете, но ресурсы очень ограничены.
Изменить: вот код
# if defined (_STLP_MSVC) || defined (__BORLANDC__) || defined (__ICL)
# define ULL(x) x##Ui64
typedef unsigned _STLP_LONG_LONG uint64;
# elif defined (_STLP_LONG_LONG) /// <---- Here
typedef unsigned _STLP_LONG_LONG uint64;
# define ULL(x) x##ULL
# elif defined(__MRC__) || defined(__SC__) //*TY 02/25/2000 - added support for MPW compilers
# include "uint64.h" //*TY 03/25/2000 - added 64bit math type definition
# else
# error "there should be some long long type on the system!"# define NUMERIC_NO_64 1
# endif
Насколько я понимаю, код пытается найти тип long long для данной платформы. В случае с pre C ++ 11 на linux g ++ переходит на указанную строку. Но когда я выполняю g ++ -std = c ++ 11 …, g ++ пропускает эту строку и переходит к ошибке «В системе должен быть тип long long long song!»
Похоже, что STLPorts не поддерживает C ++ 11.
Если ваш код требует C ++ 11, то вам не нужно использовать _STLP_LONG_LONG
вообще, так как long long
является стандартным.
Если ваш код должен работать и в более старом C ++, вы можете определить свой собственный макрос, который работает с C ++ 11, как и следовало ожидать:
#if __cplusplus >= 201103L
#define MY_LONG_LONG long long
#elif defined(_STLP_LONG_LONG)
#define MY_LONG_LONG _STLP_LONG_LONG
#endif
Конечно, если ваш код должен работать в стандарте, предшествующем C ++ 11, то вам также может понадобиться справиться с ситуацией, когда компилятор не предоставляет long long
расширение языка, т.е. #ifdef MY_LONG_LONG
чтобы проверить, можете ли вы использовать его.
РЕДАКТИРОВАТЬ: Для вашего определения, вы, вероятно, должны использовать std::int64_t
вместо long long
если вам нужен тип шириной 64 бита, как long long
технически может быть шире 64 бит.
Других решений пока нет …