wchar_t 只是 unsigned short 的 typedef 吗?

Posted

技术标签:

【中文标题】wchar_t 只是 unsigned short 的 typedef 吗?【英文标题】:Is wchar_t just a typedef of unsigned short? 【发布时间】:2011-01-24 15:05:29 【问题描述】:

例如,做:

wchar_t x;

翻译成:

unsigned short x;

【问题讨论】:

Marlon,答案取决于你问的是 C 还是 C++。你想知道其中之一还是两者都知道? 【参考方案1】:

简而言之:在 C 中可能在 C++ 中没有。

广泛。 C 将 wchar_t 定义为 typedef,但在 Unix 中它通常为 4 个字节(因此通常不短),而在 Windows 2 中则可能很短。

在 C++ 下,它是唯一的内置类型,如 charint,因此您可以合法地重载 void foo(short x)void foo(wchar_t x)

【讨论】:

【参考方案2】:

对于可能遇到此答案的其他任何人,因为您的 Visual Studio 项目中的函数调用不会链接,尽管双方都采用 wchar_t(或类似类型,例如带有 UNICODE #defined 的 LPCTSTR),并且当您 DUMPBIN 库的导出函数采用 const unsigned short * 时,请注意 VS 允许您将 wchar_t 作为内置类型关闭。如果有人在库中更改了它,而您没有在项目中点击相同的编译器开关,它将不会链接。

这个选项可以在“Project Properties>C/C++/Language/Treat WChar_t as Builtin type”下更改,也可以通过“/Zc”选项更改。

【讨论】:

【参考方案3】:

对于 C,wchar_ttypedef。无论是unsigned int 的同义词,还是完全无符号类型,还是4 字节,都是实现定义的。

在 C++ 中,wchar_t 是一个独特的内置类型。在这里,它的大小和符号也是由实现定义的。

【讨论】:

【参考方案4】:

标准不要求 wchar_t 是无符号的。也可以签名。并且必须有另一个相同大小的类型;但标准并没有明确说明其他类型必须是短的。

“与其他整数类型之一相同的大小、符号和对齐要求,称为其基础类型”(C++98 §3.9.1)。

在 C 编译器中这是一个 typedef,通常在 stddef.h 中定义

【讨论】:

注意sizeof(wchar_t) == 2 或 4,它依赖于平台。一般只有windowswchar_t有16位。 IIRC,AIX 也有 16 位 wchar_t 并且一些嵌入式平台有 sizeof(wchar_t) == 1【参考方案5】:

不,它没有。它翻译为“宽字符”。对特定平台上的可能是什么做出任何假设都是不正确的,并且首先破坏了拥有 wchar_t 的全部目的

使用抽象的目的是将类型的语义含义与其底层表示分开。

【讨论】:

【参考方案6】:

不一定;它可以是一个 4 字节的数量,或者实际上是由实现选择的任何其他大小。

这取决于编译器。

【讨论】:

...但为了符合 C++ 标准,它永远不会是 typedef @dalle(和 Artyom):是的,但问题是关于 typedef,所以它必须是关于 C。标签实际上省略了语言(我现在添加了 C),但推断是清除。 @Jonathan:不,问的问题是否 wchar_ttypedefC 标签是你的,不是 Marlon 的。对于 C,正确答案是 Yes,而对于 C++,正确答案是 No @Jonathan,我删除了 C 标签,因为他问的关于 C 的问题不清楚,所以我认为作者应该澄清这是否是唯一的 C 问题。 @Artyom:好的...我认为对这个问题有两种微妙不同但有效的解释,我们正在处理这两个不同的版本。版本 1 是“wchar_t 是 typedef,如果是,它是否是相当于 unsigned short 的 typedef”——其他人都在假设。版本 2 是“鉴于 wchar_t 是 typedef,它是 unsigned short 的 typedef”。版本 1 允许与 C++ 混淆;版本 2 没有(因为 wchar_t 不是 C++ 中的 typedef,所以问题不能与 C++ 有关)。在我看来,它是第 2 版,这似乎“很明显”。显然,其他人认为版本 1 更合理。

以上是关于wchar_t 只是 unsigned short 的 typedef 吗?的主要内容,如果未能解决你的问题,请参考以下文章

wchar_t到unsigned char转换

将 unsigned long long 转换为 wchar_t * 并连接

unsigned short int 和 unsigned int 或 unsigned short 有啥区别?

怎样把unsigned short 转换为 unsigned char

将 unsigned short * 转换为 unsigned int *

new-delete