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