【发布时间】:2011-06-22 18:13:05
【问题描述】:
这是一个非常基本的疑问,但请澄清一下
#define TLVTAG_APPLICATIONMESSAGE_V "\xDF01"
printf("%s\n", TLVTAG_APPLICATIONMESSAGE_V);
表示将要打印的内容。
【问题讨论】:
-
GCC 4.3.4 does not compile this。你在哪里找到它?它会为你编译吗?
这是一个非常基本的疑问,但请澄清一下
#define TLVTAG_APPLICATIONMESSAGE_V "\xDF01"
printf("%s\n", TLVTAG_APPLICATIONMESSAGE_V);
表示将要打印的内容。
【问题讨论】:
一步一步来(使用 C++ 标准,2.13.2 和 2.13.4 作为参考):
#define 表示在第一个出现的地方替换第二个,因此printf 被处理为printf("%s\n", "\xDF01");。
"\xDF01" 是一个字符的字符串(加上零字节终止符),\x 表示将下一个字符作为十六进制值,因此它尝试将 DF01 视为十六进制数字,并将其放入char。
由于标准带引号的字符串包含chars,而不是wchar_ts,并且您几乎可以肯定使用的是8 位char,因此结果是实现定义的,并且没有您的实现文档真的无法进一步推测。
现在,如果字符串是L"\xDF01",它的元素将是wchar_ts,它们是宽字符,通常为16 或32 位,DF01 值将变成一个字符(可能是Unicode)值,而print 语句将打印字符 \xDF 和字符 \x01,不一定按此顺序,因为 printf 打印 char,而不是 wchar_t。 wprintf 将打印出整个 wchar_t。
【讨论】:
似乎有人试图打印unicode character -> �
【讨论】: