c++ - `Int; 'सी में ठीक क्यों संकलित करता है, लेकिन सी ++ में नहीं?




2 Answers

सी मानक कहते हैं

एक static_assert घोषणा के अलावा एक घोषणा कम से कम एक घोषणाकर्ता (एक समारोह के पैरामीटर या संरचना या संघ के सदस्यों के अलावा), एक टैग, या एक गणना के सदस्यों की घोषणा करेगा।

सी ++ कहते हैं

एक साधारण घोषणा में, वैकल्पिक init-declarator-list केवल कक्षा (क्लॉज 9) या गणना की घोषणा करते समय छोड़ा जा सकता है।

किसी भी भाषा में इसका उल्लंघन करने के लिए निदान की आवश्यकता होती है। मानक कंपाइलर त्रुटियों या चेतावनियों के बारे में बात नहीं करते हैं। एक चेतावनी एक निदान है।

निम्नलिखित कार्यक्रम पर विचार करें ( here लाइव डेमो देखें)।

#include <stdio.h>
int main(void)
{
      int ;  // Missing variable name
      puts("Surprise");
}

मेरा कंपाइलर, जीसीसी 4.8.1, नीचे चेतावनी देता है:

[चेतावनी] खाली घोषणा में बेकार प्रकार का नाम [डिफ़ॉल्ट रूप से सक्षम]

यह ठीक क्यों संकलित करता है? मुझे एक कंपाइलर त्रुटि नहीं मिलनी चाहिए? g ++ 4.8.1 निम्न त्रुटि देता है जब मैं इसे C ++ प्रोग्राम के रूप में संकलित करता हूं:

[त्रुटि] घोषणा कुछ भी घोषित नहीं करती है [-फर्ममिसिव]




घोषणा का वाक्यविन्यास परिभाषित किया गया है ( init-declarator-list और init-declarator को छोड़कर):

सी 11 6.7 घोषणाएं

declaration:
    declaration-specifiers init-declarator-list opt ;
    static_assert-declaration
declaration-specifiers:
    storage-class-specifier declaration-specifiers opt
    type-specifier declaration-specifiers opt
    type-qualifier declaration-specifiers opt
    function-specifier declaration-specifiers opt
    alignment-specifier declaration-specifiers opt

ध्यान दें कि घोषणा-विनिर्देशों को बार -बार परिभाषित किया गया है, लेकिन प्रत्येक विकल्प के साथ यह वैकल्पिक है।

इसके अलावा, निम्नलिखित खंड 6 में कहा गया है:

घोषणा विनिर्देशकों में विनिर्देशकों का एक अनुक्रम होता है जो कि घोषणाकर्ताओं को इंगित करने वाली संस्थाओं के प्रकार, भंडारण अवधि और उस हिस्से के हिस्से को इंगित करता है। Initdeclarator-list घोषणाकर्ताओं का एक अल्पविराम से अलग अनुक्रम है, जिनमें से प्रत्येक में अतिरिक्त प्रकार की जानकारी हो सकती है, या प्रारंभकर्ता, या दोनों। घोषणाकर्ताओं में पहचानकर्ता (यदि कोई हो) घोषित किया जाता है।

यदि कोई हो तो शब्दों पर ध्यान दें।




Related

c++ c gcc language-lawyer variable-declaration