Visual Studio में "stdafx.h" का उपयोग किस लिए किया जाता है?


500

stdafx.hविजुअल स्टूडियो 2010 में एक परियोजना शुरू करते समय नाम की एक फ़ाइल स्वचालित रूप से उत्पन्न होती है। मुझे एक क्रॉस-प्लेटफ़ॉर्म C ++ लाइब्रेरी बनाने की आवश्यकता है, इसलिए मैं इस हेडर फ़ाइल का उपयोग नहीं कर सकता / कर सकती हूं।

किसके लिए stdafx.hप्रयोग किया जाता है? क्या यह ठीक है कि मैं इस हेडर फ़ाइल को हटा दूं?


2
अगर मुझे stdafx.h से संबंधित संकलन त्रुटि मिलती है, तो मैं आमतौर पर इस फ़ाइल को बनाने या उपयोग नहीं करने के लिए सेटिंग्स सेट करता हूं ..
phoad

6
आलेख: StdAfx.h Novices के लिए - viva64.com/en/b/0265

आप अन्य प्लेटफार्मों पर सिर्फ हेडर फ़ाइल का उपयोग कर सकते हैं, उनके लिए केवल एक सामान्य हेडर फ़ाइल है। यह सिर्फ वहाँ कोई प्रदर्शन लाभ प्रदान करता है।
एंड्रिया

जवाबों:


826

सभी सी ++ संकलक के पास एक गंभीर प्रदर्शन समस्या है जिससे निपटने के लिए। C ++ कोड का संकलन एक लंबी, धीमी प्रक्रिया है।

C ++ फ़ाइलों के शीर्ष पर संकलित हेडर एक बहुत लंबी, धीमी प्रक्रिया है। विंडोज हेड और अन्य बड़े एपीआई पुस्तकालयों के हिस्से के रूप में विशाल हेडर संरचनाओं को संकलित करना एक बहुत , बहुत लंबी, धीमी प्रक्रिया है। हर एक Cpp स्रोत फ़ाइल के लिए इसे ओवर-ओवर और ओवर करना पड़ता है, यह एक मौत की गाँठ है।

यह विंडोज के लिए अद्वितीय नहीं है, लेकिन सभी कंपाइलरों के सामने एक पुरानी समस्या है जो विंडोज जैसे बड़े एपीआई के खिलाफ संकलित करना है।

Microsoft कंपाइलर इस समस्या को एक सरल चाल के साथ सुलझा सकता है जिसे precompiled हेडर कहा जाता है । यह चाल बहुत ही धीमी है: हालाँकि हर CPP फ़ाइल संभावित रूप से और कानूनी तौर पर प्रत्येक सीपीपी फ़ाइल के शीर्ष पर शामिल हेडर फ़ाइलों की श्रृंखला को एक अलग अर्थ दे सकती है (अलग-अलग मैक्रोज़ होने जैसी चीज़ों में # पहले से शामिल है, या अलग-अलग क्रम में हेडरों को शामिल करते हुए), यह सबसे अधिक मामला नहीं है। अधिकांश समय, हमारे पास दर्जनों या सैकड़ों शामिल फाइलें होती हैं, लेकिन वे सभी आपके आवेदन में संकलित की जा रही सभी सीपीपी फाइलों के लिए समान अर्थ रखने के लिए अभिप्रेत हैं।

कंपाइलर भारी समय की बचत कर सकता है यदि उसे हर Cpp फ़ाइल को संकलित करने की शुरुआत नहीं करनी है और इसके दर्जनों को शाब्दिक रूप से हर बार शामिल करना है।

इस ट्रिक में एक विशेष हेडर फ़ाइल को सभी संकलन श्रृंखलाओं के शुरुआती बिंदु के रूप में नामित किया गया है, जिसे तथाकथित 'पूर्व-शीर्षक हेडर' फ़ाइल कहा जाता है, जो आमतौर पर ऐतिहासिक कारणों से केवल stdafx.h नाम की फ़ाइल होती है।

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

उन शर्तों के तहत, खरोंच से शुरू करने के बजाय , कंपाइलर सब कुछ संकलित करने के पहले से ही सहेजे गए परिणामों से संकलन करना शुरू कर देता है stdafx.h

मुझे विश्वास नहीं है कि यह चाल Microsoft संकलक के लिए अद्वितीय है, और न ही मुझे लगता है कि यह एक मूल विकास था।

Microsoft कंपाइलर्स के लिए, सेटिंग जो प्री-कंपाइल हेडर्स के उपयोग को नियंत्रित करती है, कंपाइलर को कमांड लाइन तर्क द्वारा नियंत्रित किया जाता है /Yu "stdafx.h":। जैसा कि आप कल्पना कर सकते हैं, stdafx.hफ़ाइल नाम का उपयोग केवल एक सम्मेलन है; आप चाहें तो नाम बदल सकते हैं।

दृश्य स्टूडियो 2010 में, यह सेटिंग GUI से CPP प्रोजेक्ट पर राइट-क्लिक करके, 'गुण' का चयन करके और "कॉन्फ़िगरेशन गुण \ C / C ++ \ Precompiled Headers" पर नेविगेट करके नियंत्रित की जाती है। विजुअल स्टूडियो के अन्य संस्करणों के लिए, GUI में स्थान भिन्न होगा।

ध्यान दें कि यदि आप पहले से तैयार हेडर को अक्षम करते हैं (या अपनी परियोजना को एक उपकरण के माध्यम से चलाते हैं जो उनका समर्थन नहीं करता है), यह आपके प्रोग्राम को अवैध नहीं बनाता है; इसका सीधा सा मतलब है कि आपका टूल हर बार खरोंच से सब कुछ संकलित करेगा।

यदि आप कोई Windows निर्भरता वाली कोई लाइब्रेरी बना रहे हैं, तो आप आसानी से टिप्पणी कर सकते हैं या फाइल #includeसे हटा सकते हैं stdafx.h। प्रति से अधिक फ़ाइल को निकालने की कोई आवश्यकता नहीं है, लेकिन स्पष्ट रूप से आप ऐसा कर सकते हैं, साथ ही ऊपर दिए गए precompile शीर्षलेख सेटिंग को अक्षम करके।


6
यहां तक ​​कि अगर आप सिर्फ std नाम स्थान से फ़ाइलों के लिए उपयोग करते हैं, तो आपको एक गति लाभ मिलता है
Ghita

11
omg, वास्तव में बहुत अच्छा जवाब। मैं मानक अनुरूप सी संकलक की तलाश में था। यह पता चला है कि मैं परियोजना के गुणों से माइक्रो $ टीटी एक्सटेंशन को अक्षम कर सकता हूं, कंपाइलर को "ऑटो" से "सी" में बदल सकता हूं और आपके पास "मानक" कंपाइलर और आईडीई हैं।
एकादशी

4
@ ऋषि: 'लाइन' से, क्या आपका मतलब है #include "stdafx.h"? यकीन है, लेकिन यह सिर्फ एक मानक #include है। "एमएस एक्सटेंशन" भाग केवल एक संकलक प्रदर्शन अनुकूलन है; यह एक हेडर फ़ाइल होने के शब्दार्थ को नहीं बदलता है जिसे "stdafx.h" कहा जाता है। ध्यान दें कि यदि आप शामिल को हटाते हैं और आपका कोड उस चीज पर निर्भर करता है जिसे stdafx.h के माध्यम से शामिल किया गया था, तो आपको सीधे शामिल करना होगा।
यूरो मिशेली जूल

4
@ Youda008, बिल्कुल सच नहीं है। एक कोड फ़ाइल संकलित करने से पहले, हेडर की सामग्री बस उस जगह पर "चिपकाया" और शाब्दिक रूप से "चिपकाया जाता है" जहां आप #includeउन्हें स्रोत फ़ाइल में करते हैं (मैक्रो का मूल्यांकन करने वाले उसी 'पूर्वप्रक्रमक' चरण द्वारा)। परिणामी कुल फ़ाइल को तब वास्तविक संकलक के पास भेज दिया जाता है, जो एक हेडर फ़ाइल को एक अलग इकाई के रूप में कभी नहीं देखता है। आप केवल हेडर फ़ाइल पर घोषणाएँ करते हैं क्योंकि हेडर फ़ाइल पर यह अच्छी तरह से काम करता है - यह एक पारंपरिक नियम है। कोशिश करो! एक पूरे कार्यक्रम के साथ एक हेडर फ़ाइल बनाएं, फिर एक स्रोत फ़ाइल बनाएं जिसमें केवल इसके लिए एक # पिन है। यह ठीक संकलन करता है।
यूरो मिकेली

28
ऐतिहासिक जिज्ञासा। 1992 के आसपास से stdafx.h तारीखों का नाम, जब MFC को रिलीज से पहले 'एप्लीकेशन फ्रेमवर्क एक्सटेंशन' कहा जाता था। विजुअल स्टूडियो 2015 अभी भी नाम को डिफॉल्ट करता है ..
kert

48

यह एक "पूर्वनिर्धारित हेडर फ़ाइल" है - आपके द्वारा stdafx.h में शामिल किसी भी हेडर को बाद के संकलन के दौरान समय बचाने के लिए पूर्व-संसाधित किया जाता है। आप MSDN पर इसके बारे में अधिक यहाँ पढ़ सकते हैं ।

यदि आप एक क्रॉस-प्लेटफ़ॉर्म एप्लिकेशन का निर्माण कर रहे हैं, तो अपना प्रोजेक्ट बनाते समय "खाली प्रोजेक्ट" की जाँच करें और विज़ुअल स्टूडियो आपके प्रोजेक्ट में कोई भी फाइल नहीं डालेगा।


15
इस फ़ाइल में ऐसा कुछ भी नहीं है जो अन्य प्लेटफार्मों पर काम नहीं करेगा। यह संकलन को धीमा कर सकता है, यदि कंपाइलर प्री-कंपाइल हेडर का समर्थन नहीं करता है, लेकिन इसे इसे नहीं तोड़ना चाहिए। यह सिर्फ एक हेडर फाइल है जिसमें अन्य हेडर फाइलें शामिल हैं।
विस्फोट

2
@detunized: हो सकता है कि मेरे उत्तर ने इसे अन्यथा ध्वनि दी हो, इसलिए उस भाग को स्पष्ट करने के लिए धन्यवाद।
कैसाब्लांका

3

"Stdafx.h" एक पूर्वनिर्धारित शीर्ष लेख है। इसमें मानक प्रणाली के लिए फ़ाइल शामिल फ़ाइलें शामिल हैं और प्रोजेक्ट-विशिष्ट के लिए ऐसी फ़ाइलें शामिल हैं, जिनका उपयोग अक्सर किया जाता है, लेकिन इन्हें बार-बार बदला जाता है। यह संकलन समय और अनावश्यक प्रसंस्करण को कम करता है।

Precompiled Header stdafx.h को मूल रूप से Microsoft Visual Studio में उपयोग किया जाता है ताकि संकलक को उन फ़ाइलों को पता चल सके जो एक बार संकलित हो गई हैं और इसे खरोंच से संकलित करने की आवश्यकता नहीं है। आप इसके बारे में अधिक पढ़ सकते हैं

http://www.cplusplus.com/articles/1TUq5Di1/

https://docs.microsoft.com/en-us/cpp/ide/precompiled-header-files?view=vs-2017


-10

मैं बस खुद ही इस में भाग गया क्योंकि मैं खुद को नंगे हड्डियों का ढांचा बनाने की कोशिश कर रहा हूं, लेकिन विजुअल स्टूडियो 2017 में एक नया Win32 प्रोग्राम विकल्प बनाकर शुरू किया। "stdafx.h" अनावश्यक है और इसे हटा दिया जाना चाहिए। फिर आप बेवकूफ "stdafx.h" और "stdafx.cpp" को हटा सकते हैं जो आपके समाधान एक्सप्लोरर के साथ-साथ आपकी परियोजना की फाइलों से भी है। इसमें जगह है, आपको लगाना होगा

#include <Windows.h>

बजाय।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.