C++ 为什么允许使用空的wchar\t文本?
请看以下代码:C++ 为什么允许使用空的wchar\t文本?,c++,character,literals,C++,Character,Literals,请看以下代码: 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_ = ''; //
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;
}
为什么编译器允许为宽字符定义空字符文本?这对于wide没有意义,就像对于编译器标记错误的char
没有意义一样
标准是否允许?
< P>这是.< /P> < P>我认为,第一个例子是不允许的,在2.23.2.1的C++标准下: 字符文字是一个或多个 用单引号括起来的字符, 如在'x'
中所示,可选择在前面加上
字母L
,如L'x'
(我强调。)根据ISO标准,这是不允许的。这是微软产品中的一个缺陷。即使是他们也没有提到这种反常(或可恶,取决于你的观点)的行为
字符文字的定义(取自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'
gcc 4.6.0拒绝了这两种说法。哇!由于这个原因,我花了几个小时都没有用(我在VS2010上)。我错误地认为附加L“”不会对字符串进行任何更改。