Aşağıdaki programda kaç satır kod var?
#include <iostream>
int main()
{
std::cout << "Hello, world!\n";
return 0;
}
Muhtemelen 7 (veya boş satırı saymadıysanız 6 veya parantezleri saymadıysanız 4) yanıtladınız.
Ancak derleyiciniz çok farklı bir şey görüyor:
~$ cpp hello.cpp | wc
18736 40822 437015
Evet, bu 18.7 KLOC sadece "Merhaba dünya!" programı. C ++ derleyicisi tüm bunları ayrıştırmak zorundadır . Bu, C ++ derlemesinin diğer dillerle karşılaştırıldığında çok uzun sürmesinin ve modern dillerin başlık dosyalarından kaçınmasının önemli bir nedenidir .
Daha iyi bir soru
Neden gelmez C başlık dosyaları var ++?
C ++, C'nin bir üst kümesi olacak şekilde tasarlanmıştır, bu nedenle başlık dosyalarını geriye dönük uyumluluk için saklamak zorunda kaldı.
Tamam, neden C'nin başlık dosyaları var?
İlkel ayrı derleme modeli nedeniyle. C derleyicileri tarafından oluşturulan nesne dosyaları hiçbir tür bilgisi içermez, bu nedenle tür hatalarını önlemek için bu bilgileri kaynak kodunuza eklemeniz gerekir.
~$ 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
Uygun tür bildirimlerini eklemek hatayı düzeltir:
~$ 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
Hiçbir #include
s olmadığına dikkat edin . Ancak çok sayıda harici işlev kullandığınızda (çoğu program bunu yapar), bunları manuel olarak bildirmek sıkıcı ve hataya açık hale gelir. Başlık dosyalarını kullanmak çok daha kolay.
Modern diller başlık dosyalarından nasıl kaçınabilir?
Tür bilgisi içeren farklı bir nesne dosyası biçimi kullanarak. Örneğin, Java * .class dosya biçimi , alan türlerini ve yöntem parametrelerini belirten "tanımlayıcıları" içerir.
Bu yeni bir buluş değildi. Daha önce (1987), Borland Turbo Pascal 4.0'a ayrı olarak derlenmiş "birimler" eklediğinde , başlık dosyalarına olan ihtiyacı ortadan kaldırmak için *.TPU
Turbo C'ler yerine yeni bir biçim kullanmayı seçti *.OBJ
.