8

मैं एक प्रोग्राम लिखने की कोशिश कर रहा हूं जो बोर्लैंड सी ++ और विजुअल सी ++ में संकलित करता है। ऐसा करने के लिए, stdafx.h फ़ाइल को शामिल करने के लिए #ifdef _MSC_VER जोड़ें, जब स्रोत VS के अंतर्गत संकलित किया गया हो। कोड को संकलित करता है और बोर्लेन्ड सी ++ में ठीक निष्पादित करता है, लेकिन वी.एस. में, यह विफल रहता है:सशर्त रूप से stdafx.h को शामिल करने के बाद मुझे संकलन त्रुटियां क्यों मिलती हैं?

त्रुटि C1020: अप्रत्याशित #endif

#ifdef _MSC_VER //I'm in VS 
#include "stdafx.h" 
#endif //this line doesn't compile in VS 


#ifdef __BORLANDC__ //I'm in Borland 
#pragma hdrstop 
#pragma argsused 
#endif 

#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    std::cout << "Hello" << std::endl; 
    std::cin.get(); 
    return 0; 
} 

मैं इस त्रुटि को कैसे ठीक कर सकते हैं?

उत्तर

11

रास्ता MSVC precompiled हेडर को लागू करता है का कारण बनता है, कि संकलक लाइन है कि precompiled शीर्ष लेख में लाता है अप करने के लिए सब कुछ पर ध्यान नहीं देता मूल रूप से है, और फ़िर से शुरू होता है। तो जब आप अपने प्रोग्राम को संकलित करते हैं, तो यह #ifdef लाइन को "याद नहीं" करता है, इसलिए #endif लाइन को इसका कोई मतलब नहीं है।

बात यह है कि अनन्य रूप से "एमएस" stdafx.h के बारे में कुछ भी नहीं है, जो कि अनन्य नामकरण योजना से परे है [जिसे आप किसी भी तरह बदल सकते हैं]। तो बोर्लैंड में पहली जगह में शामिल होने से परेशान क्यों हो? सबसे खराब स्थिति परिदृश्य, आप _MSC_VER ब्लॉक को हेडर में ले जाते हैं, और आप उसी स्थिति में समाप्त होते हैं, जिसमें आप अभी भी हैं, सिवाय इसके कि एक भी बर्बाद फ़ाइल शामिल है। या आप अपने निर्माण प्रणाली को #include को बोर्लैंड-विशिष्ट stdafx.h फ़ाइल पर रीडायरेक्ट करने दें।

2

यह प्रीकंपील्ड हेडर फीचर प्रभाव होना चाहिए। सरल समाधान इसे वीएस परियोजना सेटिंग्स में बंद करना है। समस्या है, संकलक जब यह राज्य precompiled शीर्ष लेख फ़ाइल में सहेजे गए

#include "stdafx.h" 

लाइन का सामना करना पड़ता अपने राज्य रीसेट करता है। तो #ifdef... लाइन ignored हो जाता है और #endif लाइन संकलक त्रुटि

1

अन्य ने पीसीएच मुद्दे पर टिप्पणी की। एक अलग नोट पर, बोर्लैंड में, #pragma argsused को किसी फ़ंक्शन से जोड़ा जाना है। इसका उद्देश्य संकलक को एकल करना है कि फ़ंक्शन के तर्क फ़ंक्शन बॉडी द्वारा उपयोग नहीं किए जाते हैं, इसलिए यह "अप्रयुक्त तर्क" चेतावनियों को उत्सर्जित नहीं करता है। इस प्रकार, आप #ifdef ब्लॉक में #pragma hdrstop और #pragma argsused समूह नहीं कर सकते हैं। तुम्हें पता है, उन्हें अलग करने की जरूरत है जैसे:

#include "stdafx.h" 

#ifdef __BORLANDC__ 
#pragma hdrstop 
#endif 

#include <iostream> 

#ifdef __BORLANDC__ 
#pragma argsused 
#endif 
int main(int argc, char* argv[]) 
{ 
    std::cout << "Hello" << std::endl; 
    std::cin.get(); 
    return 0; 
} 

एक सरल समाधान बस बजाय तर्क नाम टिप्पणी करने के लिए है:

#include "stdafx.h" 

#ifdef __BORLANDC__ 
#pragma hdrstop 
#endif 

#include <iostream> 

int main(int /*argc*/, char* /*argv[]*/) 
{ 
    std::cout << "Hello" << std::endl; 
    std::cin.get(); 
    return 0; 
} 
5

हम संकलक stdafx.h करने के लिए सशर्त जाते हैं तो हम इस त्रुटि से बचने कर सकते हैं। उदाहरण के लिए निम्न कोड लाइनों के लिए stdafx.h

********************* stdafx.h ************************** 
    #pragma once 

    #if defined (_MSC_VER) 

    #include "targetver.h" 

    #define WIN32_LEAN_AND_MEAN    
    // Windows Header Files: 
    #include <windows.h> 
    #endif 
    ********************************************************* 

में परिभाषित किया जा सकता तो आप इस मैक्रो सशर्त भीतर pragma once या पारंपरिक हैडर गार्ड स्विच कर सकते हैं के रूप में आप की उम्मीद है। इसलिए, हम किसी भी सी/सी ++ कंपाइलर के साथ stdafx.h बनाने में सक्षम हैं क्योंकि हम अपने मैक्रो सशर्त स्टेटमेंट intostdafx.h

पोर्ट करते हैं
संबंधित मुद्दे