之前float、int等转字符串一直傻不拉几的用stringstream,最近才发现竟然有个to_string。
string to_string (int val); string to_string (long val); string to_string (long long val); string to_string (unsigned val); string to_string (unsigned long val); string to_string (unsigned long long val); string to_string (float val); string to_string (double val); string to_string (long double val);
一下用得贼爽,Windows平台、IOS平台都没问题。今天编Android的,一下傻眼了,竟然找不到这个函数。
点进std源文件里,<bits/basic_string.h>里明明有这个函数的一堆实现。
那么是被什么宏给排除了么?找到上边的宏
#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \ && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
头大!__cplusplus就是c++的版本,在gradle里配置的cppFlags.add("-std=c++11")肯定是支持c++11了的。后面两个宏查了也无头绪。
持续搜索后发现,果然所有问题都可以早stackoverflow上找到答案!
https://stackoverflow.com/questions/22774009/android-ndk-stdto-string-support
里面说了,stl用c++_shared或者c++_static就可以解决。(我的是gnustl_static")。
如果是gradle+cmake配置的项目,就这样:
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
...
arguments "-DANDROID_STL=c++_shared"
//或arguments "-DANDROID_STL=c++_static"
}
}
}
...
}
如果是Experimental Gradle Plugin,就这样:
model {
...
android {
...
ndk {
...
stl = "c++_shared"
//或 stl = "c++_static"
}
}
}
加上之后刷新项目,IDE里竟然真的找到to_string的定义了。
开始编译,我的代码倒是没问题了,但是链接时,第三方库里一大堆未找到定义的链接错误!
这么说,第三方库用的是gnustl的,我也必须用gnustl的了?难搞!
只能暂时安卓端特殊处理,后续继续深入研究。