Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么允许使用空的wchar\t文本?_C++_Character_Literals - Fatal编程技术网

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“”不会对字符串进行任何更改。