Android-NDK 的 GGC/C++ 对于 std::string::find/std::getline(...) 来说似乎不稳定

Android-NDK's GGC/C++ appears to be erratic for std::string::find/std::getline(...)

本文关键字:std 不稳定 string GGC C++ 对于 find Android-NDK getline      更新时间:2023-10-16

对于负数字符,std::string::find(char ch)std::getline(stream, str, delim)似乎不稳定;在Android NDK R6B上。基本上是std::string::find returns std::string::npos,例如当字符是0xEB时。有人发现他们有什么问题吗?它们似乎对微软风投公司很有效。

字符在MSVC中默认有符号,在NDK上的GCC中默认无符号。要改变这一点,请在Android.mk中添加以下行:

LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS) -fsigned-char

这可能会破坏采用字符参数的库函数,如strchr。问题是,他们将该字符作为int,并且如果char为负数/超过0x7F,则将char扩展为int的规则会随编译器设置而变化。通过有符号字符设置,负字符值用1位扩展为负整数,而无符号字符用0位扩展为256以下的正整数。图书馆期望后者。

我最终在我的项目中重新定义了strchr,如下所示:

// In the common header
extern char *strchr_sb(const char *s, int c);
#define strchr strchr_sb
// Elsewhere
#undef strchr
char *strchr_sb(const char *s, int c)
{
    return strchr(s, c & 0xff);
}