2011-05-27 17 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

जीसीसी 4.6.0 दोनों बयान अस्वीकार करता है। वास्तव में – pmr

उत्तर

11

यह a bug in VC++ है।

+0

। और [ऐसा नहीं लगता है कि यह तय किया जा रहा है] (https://connect.microsoft.com/VisualStudio/feedback/details/250372/vc-allows-empty-wide-characters-but-not-empty- पात्र) –

+3

मुझे आश्चर्य है कि वीसी ++ 2023 में यह बग होगा ... –

+0

वाह! इस वजह से मैंने व्यर्थ में कुछ घंटे बिताए (मैं वीएस -2010 पर हूं)। एल 'संलग्न करने की मेरी गलती थी कि स्ट्रिंग में कोई बदलाव नहीं आएगा। –

3

मैं तर्क था कि पहला उदाहरण सी ++ मानक का 2.23.2.1 प्रति की अनुमति नहीं है:

एक चरित्र शाब्दिक एक या ’x’ में के रूप में एकल उद्धरण में संलग्न अधिक वर्ण, है , वैकल्पिक रूप से अक्षर L से पहले, जैसा कि L’x’ में है।

(जोर मेरा।)

4

यह नहीं आईएसओ मानक के अनुसार अनुमति है। यह माइक्रोसॉफ्ट के उत्पाद में एक बग है। यहां तक ​​कि उनके page describing that particular feature इस अशिष्ट (या घृणास्पद, आपके दृष्टिकोण के आधार पर) व्यवहार का कोई उल्लेख नहीं करते हैं।

एक चरित्र शाब्दिक (C++ 0x की 2.14.3 से लिया लेकिन प्रासंगिक बिट सी ++ 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’ क्रमशः क्रमशः।

संबंधित मुद्दे