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++ 下,它是唯一的内置类型,如 char
或 int
,因此您可以合法地重载 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_t
是 typedef
。无论是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_t
是typedef
。 C
标签是你的,不是 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章
将 unsigned long long 转换为 wchar_t * 并连接
unsigned short int 和 unsigned int 或 unsigned short 有啥区别?
怎样把unsigned short 转换为 unsigned char