2017-04-04 17 views
10

एक answer में निम्न कोड था:अंदर fstream को परिभाषित करना एक 'अगर' सशर्त

if (std::ifstream input("input_file.txt")) 
    ; 

कौन सा सुविधाजनक लगता है, जहां यह पुष्टि की है करने के लिए 'इनपुट' चर के दायरे को सीमित वैध होने के लिए, लेकिन न तो वीएस2015 और न ही जी ++ इसे संकलित करने लगता है। क्या यह कुछ कंपाइलर विशिष्ट चीज है या क्या इसे कुछ अतिरिक्त झंडे की आवश्यकता है?

VS2015 में आईडीई पर प्रकाश डाला "std :: ifstream" और "input_file.txt" साथ ही पिछले कोष्ठकों। "std :: ifstream" को ध्वजांकित किया गया है "त्रुटि: यहां फ़ंक्शन प्रकार की अनुमति नहीं है"।

VS2015 सी ++ संकलक त्रुटियों निम्नलिखित देता है:

  • C4430 लापता प्रकार निर्दिष्टकर्ता - ग्रहण इंट। नोट: सी ++ डिफ़ॉल्ट-पूर्णांक
  • C2059 सिंटैक्स त्रुटि का समर्थन नहीं करता। '('

उत्तर

13

कोड आप कानूनी नहीं है .. अभी तक करने के लिए सी ++ 11 एक पहले अगर बयान हो सकता है

if(condition) 
if(type name = initializer) 

और name हालत निर्धारित करने के लिए एक bool के रूप में मूल्यांकन किया जाएगा। सी ++ 11/14 अनुमति देने के लिए खर्च नियमों में

if(condition) 
if(type name = initializer) 
if(type name{initializer}) 

कहाँ, फिर से, name के बाद यह हालत निर्धारित करने के लिए आरंभ नहीं हो जाता एक bool रूप evaluted है।

सी ++ 17 में शुरू हो रहा है, हालांकि आप एक लूप जैसे कंपाउंड स्टेटमेंट के रूप में एक कथन में एक चर घोषित करने में सक्षम होंगे जो आपको चर के साथ चर को प्रारंभ करने की अनुमति देता है।

if (std::ifstream input("input_file.txt"); input.is_open()) 
{ 
    // do stuff with input 
} 
else 
{ 
    // do other stuff with input 
} 

ऐसा लगता है, हालांकि यह सिर्फ वाक्यात्मक चीनी और इसके बाद के संस्करण कोड वास्तव में http://en.cppreference.com/w/cpp/language/if के अनुसार

{ 
    std::ifstream input("input_file.txt") 
    if (input.is_open()) 
    { 
     // do stuff with input 
    } 
    else 
    { 
     // do other stuff with input 
    } 
} 
+1

आप * * * स्थिति * में एक चर * सी ++ 03 पर वापस कर सकते हैं। यह सिर्फ इतना है कि प्रारंभिक रूप का रूप सीमित है। –

+0

@FredLarson Answr अपडेट किया गया। मेरे पास यह गलत था। सी ++ 98/03 में वापस आप एक चर घोषित कर सकते हैं। – NathanOliver

+0

@NathanOliver क्या यह 'इनपुट' के दायरे को भी सीमित नहीं करता है? या यह सिर्फ चीनी है? – user3358771

8

लिए अनुवाद किया है कि कोड कानूनी नहीं है कि (इस साइट में बहुत सम्मानित है, लेकिन मैं यह कर सकते हैं वांछित अगर मानक संदर्भ के लिए शिकार)। आप कर सकते हैं एक अगर हालत में चर घोषित लेकिन वे = या {} द्वारा प्रारंभ किया जाना चाहिए। तो मान लें कि आपके पास कम से कम C++ 11 है जो आप कर सकते हैं:

if (std::ifstream input{"input_file.txt"}) 
    ; 
+2

पर थोड़ा अलग है ओपी का कोड अभी भी C++ 17 में कानूनी नहीं है। नया * init-statement * सुविधा * शर्त * के आवश्यक रूप को नहीं बदलती है। –

+0

@ टी.सी. '(अभी तक) नोट हटा दिया - धन्यवाद। –

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