请查看以下代码:
int main(int argc, char* argv[])
{
// This works: (Disable Lang Ext = *Yes* (/Za))
wchar_t wc0 = L'\0';
wchar_t wc_ = L'';
assert(wc0 == wc_);
// This doesn't compile (VC++ 2010):
char c0 = '\0';
char c_ = ''; // error C2137: empty character constant
assert(c0 == c_);
return 0;
}
为什么编译器允许为宽字符定义空字符文字?这对于宽泛没有意义,正如编译器标记错误的char
没有意义。
标准是否允许这样做?
答案 0 :(得分:11)
答案 1 :(得分:4)
根据ISO标准,不允许。这是微软产品中的一个错误。甚至他们的page describing that particular feature也没有提到这种异常(或者令人厌恶,取决于你的观点)的行为。
字符文字的定义(取自C ++ 0x的2.14.3
,但相关位与C ++ 03相同)包含:
character-literal:
L’ c-char-sequence ’
c-char-sequence:
c-char
c-char-sequence c-char
c-char:
any member of the source character set except
the single-quote ’, backslash \, or new-line character
escape-sequence
universal-character-name
escape-sequence:
simple-escape-sequence
octal-escape-sequence
hexadecimal-escape-sequence
simple-escape-sequence: one of
\’ \" \? \\ \a \b \f \n \r \t \v
octal-escape-sequence:
\ octal-digit
\ octal-digit octal-digit
\ octal-digit octal-digit octal-digit
hexadecimal-escape-sequence:
\x hexadecimal-digit
hexadecimal-escape-sequence hexadecimal-digit
正如您所看到的,没有的方式是'
中的L'x'
字符之间没有任何结果。它必须是一个或多个c_char
个字符。事实上,这在以下段落(我的重点)中已明确说明:
字符文字是用单引号括起来的一个或多个字符,如
’x’
中所示,可选地前面有一个字母u
,U
,或L
,分别为u’y’
,U’z’
或L’x’
。
答案 2 :(得分:3)
我认为第一个例子是不允许的,符合C ++标准的2.23.2.1:
字符文字一个或多个 用单引号括起来的字符, 与
’x’
中一样,可选地以。{1}}开头 字母L
,如L’x’
。
(强调我的。)