当char或wchar_t == -1时,它是什么意思?

时间:2014-04-21 20:10:42

标签: c++ visual-studio-2012

在Visual Studio中,为什么要将字符(以前是char,现在是wchar_t)的值与值-1进行比较?

我有一个对-1进行多次无效检查的项目:

TCHAR ch;
...
if(ch==-1)

Coverity告诉我"" ch == -1"无论其操作数的值如何,它总是为假。"

现在,这最初编写为使用char值而不是wchar_t,并在需要unicode支持时进行了升级。我需要找出为什么" char ch;"正在检查-1,以便我可以对wchar_t进行类似的检查。

3 个答案:

答案 0 :(得分:1)

整数常量EOF通常#defined到-1。如果这是您的代码正在检查的内容(取决于ch的来源),那么相应的wchar_t比较将是WEOF,并且相应的Windows TCHAR宏似乎是{ {3}}

PS:正如评论中正确指出的那样,如果某个值已转换为charwchar_t,则将其与EOF或{{1}进行比较为时已晚}:大量编码使用char WEOF作为有效字母,并且在转换后与EOF无法区分。代码完全错误:变量'\xff'需要具有ch / int / wint_t类型才能使此类比较有效。

答案 1 :(得分:0)

大多数情况下,-1 / 255EOF

相关联

答案 2 :(得分:0)

TCHAR的类型是什么?如果它真的是无符号类型 小于int,表达式永远不会是真的,因为 整体推广将会发生,从而产生很大的积极影响 整数,但仍然小于UINT_MAX,其中-1UINT_MAX。 (如果TCHAR类似unsigned short, 例如,它通常可以具有该范围内的值 0 ... 65365,将转换为intunsigned int 没有改变价值。 -1,另一方面,将 通常在转换为时转换为类似4294967295的内容 无符号的。)

如果您正在检查文件结尾(例如,在 std::iwstream.get()),然后你应该之前 转换int的结果。即使使用char,它也没有 工作;如果普通char是无符号的,那么它永远不会是-1,并且 如果签名,那么一个有效字符(ISO 8859-1中的ÿ) 将显示为文件结尾。