gnustl_static中未声明to_string()

时间:2019-07-05 05:56:26

标签: android string c++11 java-native-interface gnu

此代码将给出错误消息“在此范围内未声明to_string”

#include <jni.h>
#inlcude <string>
#include <android/log.h>
using namespace std;

JNIEXPORT jboolean JNICALL Java_com_package_activity_method
(JNIEnv *env, jobject classObject,jdouble number) {
  String string= to_string(number);
   __android_log_print(ANDROID_LOG_DEBUG, "JNI","The number is: %s,string);
  return;
}

如果跟踪头文件,我可以在string.h-> basic_string.h

中找到它们
inline string
to_string(double __val)
{
  const int __n = 
   __gnu_cxx::__numeric_traits<double>::__max_exponent10 + 20;
  return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
                   "%f", __val);
}

所以它毕竟是被宣布的...

我可以通过编写自己的to_string版本来解决问题

String to_string(double number){
    std::stringstream ss;
    ss << number;
    return ss.str();  }

或更改  -DANDROID_STL到c ++ _ static

但是我想了解的是,哪一部分代码遮盖了gnustl中的to_string方法。

1 个答案:

答案 0 :(得分:0)

据我从其他帖子中了解到的,这就是为什么to_string不包含在GNUSTL中的原因

在c ++ config.h行1240中,以下行被注释掉,因此未定义_GLIBCXX_USE_C99

/* Define if C99 functions or macros from <wchar.h>, <math.h>, <complex.h>,
   <stdio.h>, and <stdlib.h> can be used or exposed. */
/* #undef _GLIBCXX_USE_C99 */

,并在basic_string.h:2812

处检查了这种情况
#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
    && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))

但是为什么我不理解stdio stdlib不是一些基本的c库呢?