1

出现这种情况std::string::find(char ch)并且std::getline(stream, str, delim)对于否定字符来说是不稳定的;在 Android NDK R6B 上。基本上std::string::find returns std::string::npos,说当字符是0xEB。有没有人发现他们有任何问题?它们似乎适用于 MSVC。

4

1 回答 1

1

字符在 MSVC 中默认是有符号的,在 NDK 上的 GCC 中默认是无符号的。要更改它,将以下行添加到 Android.mk:

LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS) -fsigned-char

这可能会 C 中断接受字符参数的库函数,例如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);
}
于 2012-07-25T18:46:16.803 回答