STLPort使用C++ 11

Sas*_*ank 0 c++ stlport c++11

我正在尝试将我的办公室代码从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
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?我尝试在互联网上搜索,但资源非常有限.

编辑:这是代码

# 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
Run Code Online (Sandbox Code Playgroud)

据我所知,代码试图找到给定平台的long long类型.对于Linux上的预C++ 11,g ++会转到指向的行.但是当我执行g ++ -std = c ++ 11 ...时,g ++跳过这一行并转到错误"系统上应该有长长的歌曲!"

eer*_*ika 5

似乎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
Run Code Online (Sandbox Code Playgroud)

当然,如果您的代码必须使用pre-C++ 11标准,那么您可能还需要处理编译器不提供long long-language扩展的情况,即用于#ifdef MY_LONG_LONG检查是否可以使用它.

编辑:对于您的定义,您应该使用std::int64_t而不是long long如果您需要64位宽的类型,long long技术上可以宽于64位.