STLPort с использованием C ++ 11 - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь перенести мой офисный код с 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 для данной платформы.C ++ 11 в linux, g ++ переходит на указанную строку, но когда я выполняю g ++ -std = c ++ 11 ..., g ++ пропускает эту строку и переходит к ошибке «в системе должен быть тип long long long song!«

1 Ответ

0 голосов
/ 24 октября 2018

Похоже, что 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, чтобы проверить, можете ли вы использоватьit.

EDIT: для вашего определения вам, вероятно, следует использовать std::int64_t вместо long long, если вам нужен тип шириной 64 бита, поскольку технически long long может быть шире 64 бит.

...