5

मैं समझता हूँ कि क्या precompiled हेडर "#include" stdafx.h "के साथ क्या कर रहे हैं और हाँ, मैं जानता हूँ कि मैं उन्हें बंद कर सकते हैं। लेकिन वह मेरे सवाल नहीं है।विज़ुअल स्टूडियो सी ++ को उन फ़ाइलों पर भी "StdAfx.h" की आवश्यकता क्यों है, जिनकी आवश्यकता नहीं है?

आप precompiled हेडर उपयोग कर रहे हैं, विजुअल C++ की आवश्यकता है प्रत्येक सीपीपी फ़ाइल को "StdAfx.h" में शामिल करें, यहां तक ​​कि उन फ़ाइलों को जो StdAfx.h में किसी भी शीर्षलेख का उपयोग नहीं कर रहे हैं। यदि आप एक फ़ाइल पर StdAfx.h को शामिल करना भूल जाते हैं, तो यह एक त्रुटि है। लेकिन क्यों? स्पष्ट दृष्टिकोण केवल "यदि आप StdAfx.h शामिल करते हैं तो वह फ़ाइल इसका उपयोग करेगी, लेकिन यदि आप इसे शामिल करना भूल जाते हैं, तो उन शीर्षलेख फ़ाइलों को शामिल नहीं किया जाएगा।" मुझे समझ में नहीं आता कि वीसी ++ आपको क्यों चाहिए जब इसकी आवश्यकता नहीं होती है तो StdAfx.h शामिल करें। ऐसा लगता है कि उनके लिए सामान्य हेडर फ़ाइल की तरह व्यवहार करना आसान होता।

क्या कोई अच्छा कारण है कि इसकी आवश्यकता क्यों है?

+0

प्रीकंपील्ड हेडर का पूरा बिंदु, संकलन समय को छोटा करना है। यदि कोई अतिरिक्त चेक किया जाएगा, तो यह संकलन समय में वृद्धि करेगा, जो प्रीकंपील्ड हेडर के एकमात्र लाभ को प्रस्तुत करेगा - बेकार। –

+0

आप ऐसा क्यों कहते हैं? अतिरिक्त चेक की आवश्यकता नहीं है - वीसी ++ बस "अगर पहली पंक्ति # शामिल है" stdafx कर सकती है।एच "तो वहां उन प्रतीकों की प्रतिलिपि बनाएँ, लेकिन अन्यथा कुछ भी नहीं"। ऐसा लगता है कि माइक्रोसॉफ्ट के लिए ऐसा करना आसान होगा और उपयोगकर्ताओं के लिए भी अधिक स्पष्ट होगा। – user2543623

+0

वास्तव में, * प्रत्येक * पर "StdAfx.h" की आवश्यकता नहीं है, वास्तव में संकलन समय में सुधार होगा, तब से उन precompiled प्रतीकों को उन .cpp फ़ाइलों पर कॉपी करने की आवश्यकता नहीं होगी जिन्हें उनकी आवश्यकता नहीं है। – user2543623

उत्तर

7

आपकी प्रोजेक्ट डिफ़ॉल्ट "प्रीकंपिल्ड हेडर का उपयोग करें" है। यदि आप चाहें तो व्यक्तिगत फाइलों को "प्रीकंपील्ड हेडर का उपयोग न करें" पर सेट कर सकते हैं।

वास्तव में, stdafx.cpp ही परियोजना चूक से एक अलग विकल्प है:

enter image description here

क्या इस विन्यास कह रहा है कि "इस फ़ाइल (Stdafx.cpp) संकलन शुरू, बंद करो जब आप संकलन खत्म "। और .pch फ़ाइल के रूप में के रूप में precompiled जानकारी बचाने" बयान है कि stdafx.h शामिल दृश्य स्टूडियो भी बहुत चालाक पहले इस फाइल को संकलित करने के लिए तो यह उपयोग के लिए उपलब्ध है

परियोजना चूक कर रहे हैं:।

enter image description here

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

यदि आपके पास ऐसी फ़ाइल है जिसे आप पूर्व-संकलित जानकारी का उपयोग नहीं करना चाहते हैं, तो आप फ़ाइल का चयन कर सकते हैं और इसे ओवरराइड कर सकते हैं। उदाहरण:

enter image description here

दृश्य स्टूडियो precompiled जानकारी का उपयोग नहीं होगा और इसमें एक शीर्ष शामिल करने के लिए देखने के लिए नहीं होगा।

+0

तकनीकी रूप से, यह ** ** ओपी प्रश्न का उत्तर नहीं देता है, क्योंकि उन्होंने यह कहा था कि, उनके प्रश्न की पहली वाक्य में: _yes, मुझे पता है कि मैं उन्हें बंद कर सकता हूं। लेकिन यह मेरा सवाल नहीं है ._ –

+2

मुझे पता है, मैं एक संपादन पर काम कर रहा हूं। मैं अपने कंप्यूटर के सामने नहीं था और कुछ स्क्रीनशॉट चाहता था। प्लस ओपी शायद नहीं जानता कि आप * व्यक्तिगत रूप से * उन्हें बंद कर सकते हैं, जो मेरा मुद्दा था। ओपी को उद्धृत करने के लिए: [विज़ुअल सी ++ * प्रत्येक * सीपीपी फ़ाइल को # शामिल "StdAfx.h"] की आवश्यकता है और यह नहीं करता है। –

+1

@ AlgirdasPreidžius Well, आप मानते हैं कि मूल पोस्टर जानता है कि वह इसे विशिष्ट फाइलों के लिए बंद कर सकता है, न कि पूरे प्रोजेक्ट। मेरा अनुभव मुझे बताता है कि ज्यादातर लोग यह नहीं जानते कि यह कैसे करें या कैसे करें। मैं उन्नत डिग्री वाले लोगों के साथ काम करता हूं जो एक दशक से अधिक समय तक उपकरण का उपयोग कर रहे हैं और वे इसे नहीं जानते हैं। चाहे वह जानता है या नहीं, स्पष्ट नहीं है। मार्क ने उपयोगी जानकारी दी। असली जवाब है, "क्योंकि माइक्रोसॉफ्ट ने ऐसा कहा।" –

7

बस मार्क के उत्तर के लिए एक जोड़ा। वास्तव में, आपको सभी प्रोजेक्ट स्रोत फ़ाइलों में मैन्युअल रूप से stdafx.h शामिल करने की आवश्यकता नहीं है। enter image description here

इस तरह stdafx.h स्वचालित रूप से आपके सभी स्रोतों में शामिल किया जाएगा: आप परियोजना विकल्प Forced Include Files उपयोग कर सकते हैं।

+1

अच्छा बिंदु, बस सुनिश्चित करें कि अगर एक से अधिक मजबूर हैं तो इसमें शामिल है कि प्रीकंपील्ड हेडर पहले सूचीबद्ध है, इसी कारण से इसे स्रोत फ़ाइल में सबसे पहले होना चाहिए .... किसी भी कोड को अनदेखा करने से पहले और संकलक के साथ शुरू होता है .pch फ़ाइल में राज्य। –

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