2011-05-27 80 views
12

请看下面的代码:为什么允许空的wchar_t文字?

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

gcc 4.6.0拒绝这两个语句。 – pmr 2011-05-27 07:54:39

回答

11

这是a bug in VC++

+0

确实。 [它看起来不会被修复](https://connect.microsoft.com/VisualStudio/feedback/details/250372/vc-allows-empty-wide-characters-but-not-empty-字符) – 2011-05-27 09:14:50

+3

我不知道VC++ 2023是否会有这个bug ... – 2011-05-27 09:15:48

+0

哇!由于这个,我花了几个小时徒劳(我在VS2010上)。这是我的错误,假设追加L''不会对字符串进行任何更改。 – 2011-08-22 04:57:26

3

我认为,第一个例子中是不允许的,按照C++标准的2.23.2.1:

字符文字是一个或多个 字符在单引号, 如’x’ ,可选地在 字母L之前,如在L’x’中那样。

(重点煤矿。)

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的一个前面的字符, UL,分别在u’y’U’z’L’x’中。

相关问题