unicode char 与非 unicode char 比较,但没有警告也没有错误
Posted
技术标签:
【中文标题】unicode char 与非 unicode char 比较,但没有警告也没有错误【英文标题】:unicode char comparing to non unicode char, but no warning nor error 【发布时间】:2008-12-31 16:18:44 【问题描述】:为什么下面的代码没有给出错误,也没有任何关于隐式转换的警告?
std::wstring str = L"hi";
if(str[0] == 'h')
cout<<"strange"<<endl;
正确的正常代码是:
std::wstring str = L"hi";
if(str[0] == L'h')
cout<<"strange"<<endl;
编译器:visual studio 2005
警告级别:4级(最高)
【问题讨论】:
wchar_t 是否设置为本机类型? 是的,无论 wchar_t 是否设置为本机类型,它都不会发出警告。 【参考方案1】:它不会给出警告,因为比较是有效的。一般来说,您始终可以比较整数类型,它们只是根据需要提升为更广泛的类型。
而且我很确定一些编译器会对此发出警告。你用的是哪一个? (在任何情况下,警告都是特定于编译器的,不需要就这个或其他任何事情发出警告)
【讨论】:
另外值得注意的是:许多编译器会让你设置一个警告级别。如果你将它设置得足够高,它可能会给你一个警告。静态代码分析工具也可以做同样的事情。 还研究了 c89 价值/标志保护促销的理由:lysator.liu.se/c/rat/c2.html#3-2-1-1 我上周读了它,发现它很好,因为它很好地解释了它背后的理由 编译器应该给出无效代码的错误。通过排除,这意味着警告是针对有效(但可疑)的代码。【参考方案2】:为什么下面的代码没有报错...
不是因为 C++ 允许隐式转换吗?例如,以下内容是否也合法:
if (str[0] == 104) //C++ allows various implicit type conversions
...也没有任何关于隐式转换的警告?
这个问题是特定于编译器的:您使用的是哪个编译器?可能有一个编译器选项会影响您从编译器获得的警告类型。
【讨论】:
【参考方案3】:很难确定为什么编译器不发出警告。他们可能出于任何原因这样做,并且在代码可疑时应该这样做。但是,由于代码在技术上是正确的,因此可能会出现错误。
在这种情况下,我的假设是编译器不会发出警告,因为编译器使用 Unicode wchar_t
和 ISO-8859-1 字符。 Unicode 子集 U+0000 到 U+00FF 等于 ISO 8859-1 字符 0-FF。因此,每个 char 都具有与其对应的 wchar_t 相同的数值。结果,wchar_t('a')==L'a'
。
【讨论】:
以上是关于unicode char 与非 unicode char 比较,但没有警告也没有错误的主要内容,如果未能解决你的问题,请参考以下文章
C / C ++如何读取UNICODE的const char?