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++0x 中 char 和 Unicode 的签名

C / C ++如何读取UNICODE的const char?

存储在 C char 中的 Unicode

C ++ 0x中char和Unicode的签名

如何在 C++ 中使用 UTF-8 和 Unicode? C++20 char8_t 有多大?

为啥用于 Unicode 属性测试的 C# System.Char 方法有两个重载?