निम्नलिखित कार्यक्रम में कोड की कितनी लाइनें हैं?
#include <iostream>
int main()
{
std::cout << "Hello, world!\n";
return 0;
}
आपने शायद 7 (या 6 का उत्तर दिया है यदि आपने रिक्त पंक्ति की गणना नहीं की है, या 4 यदि आपने ब्रेसिज़ की गिनती नहीं की है)।
हालाँकि आपका कंपाइलर कुछ अलग देखता है:
~$ cpp hello.cpp | wc
18736 40822 437015
हाँ, यह 18.7 KLOC सिर्फ एक "हैलो, दुनिया!" कार्यक्रम। C ++ कंपाइलर को वह सब पार्स करना होगा। यह एक प्रमुख कारण है कि अन्य भाषाओं की तुलना में C ++ संकलन में इतना समय लगता है , और आधुनिक भाषाओं ने हेडर फ़ाइलों को क्यों बढ़ाया।
एक बेहतर सवाल होगा
C ++ में हेडर फाइलें क्यों होती हैं ?
C ++ को C के एक सुपरसेट के रूप में डिजाइन किया गया था, इसलिए इसे पीछे की संगतता के लिए हेडर फ़ाइलों को रखना पड़ता था।
ठीक है, तो सी में हेडर फाइलें क्यों हैं?
अपने आदिम अलग संकलन मॉडल के कारण। C कंपाइलर्स द्वारा बनाई गई ऑब्जेक्ट फाइल्स में किसी भी प्रकार की जानकारी शामिल नहीं है, इसलिए इस प्रकार की त्रुटियों को रोकने के लिए आपको अपने सोर्स कोड में इस जानकारी को शामिल करना होगा।
~$ cat sqrtdemo.c
int main(void)
{
/* implicit declaration int sqrt(int) */
double sqrt2 = sqrt(2);
printf("%f\n", sqrt2);
return 0;
}
~$ gcc -Wall -ansi -lm -Dsqrt= sqrtdemo.c
sqrtdemo.c: In function ‘main’:
sqrtdemo.c:5:5: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
sqrtdemo.c:5:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
~$ ./a.out
2.000000
उचित प्रकार की घोषणाओं को जोड़ना बग को ठीक करता है:
~$ cat sqrtdemo.c
#undef printf
#undef sqrt
int printf(const char*, ...);
double sqrt(double);
int main(void)
{
double sqrt2 = sqrt(2);
printf("%f\n", sqrt2);
return 0;
}
~$ gcc -Wall -ansi -lm sqrtdemo.c
~$ ./a.out
1.414214
ध्यान दें कि कोई #include
एस नहीं हैं । लेकिन जब आप बड़ी संख्या में बाहरी कार्यों (जो कि अधिकांश कार्यक्रम) का उपयोग करते हैं, मैन्युअल रूप से उन्हें थकाऊ घोषित करने और त्रुटि-प्रवण हो जाता है। हेडर फ़ाइलों का उपयोग करना बहुत आसान है।
हेडर फ़ाइलों से बचने के लिए आधुनिक भाषाएं कैसे सक्षम हैं?
किसी भिन्न ऑब्जेक्ट फ़ाइल स्वरूप का उपयोग करके जिसमें टाइप जानकारी शामिल है। उदाहरण के लिए, जावा * .class फ़ाइल प्रारूप में "डिस्क्रिप्टर" शामिल हैं जो फ़ील्ड और विधि पैरामीटर के प्रकार निर्दिष्ट करते हैं।
यह कोई नया आविष्कार नहीं था। इससे पहले (1987), जब बोरलैंड ने टर्बो पास्कल 4.0 के लिए अलग से संकलित "इकाइयां" जोड़ीं, तो उसने हेडर फ़ाइलों की आवश्यकता को हटाने के लिए *.TPU
टर्बो सी के बजाय एक नए प्रारूप का उपयोग करना चुना *.OBJ
।