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 に展開するルールがコンパイラの設定によって異なることです。signed char 設定では、負の char 値は 1 ビットで負の整数に拡張され、unsigned char では 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 に答える