다음 프로그램에는 몇 줄의 코드가 있습니까?
#include <iostream>
int main()
{
std::cout << "Hello, world!\n";
return 0;
}
아마도 7 (또는 빈 줄을 세지 않으면 6, 중괄호를 세지 않으면 4)이라고 대답했을 것입니다.
그러나 컴파일러는 매우 다른 것을 봅니다.
~$ cpp hello.cpp | wc
18736 40822 437015
그렇습니다. "Hello, world!" 프로그램. C ++ 컴파일러는이 모든 것을 파싱 해야합니다. 이것이 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
s 가 없습니다 . 그러나 많은 수의 외부 함수 (대부분의 프로그램에서 사용)를 사용하면 수동으로 선언하면 지루하고 오류가 발생하기 쉽습니다. 헤더 파일을 사용하는 것이 훨씬 쉽습니다.
현대 언어는 어떻게 헤더 파일을 피할 수 있습니까?
유형 정보가 포함 된 다른 객체 파일 형식을 사용합니다. 예를 들어, Java * .class 파일 형식 에는 필드 유형 및 메소드 매개 변수를 지정하는 "설명자"가 포함됩니다.
이것은 새로운 발명이 아닙니다. Borland (1987)는 Borland가 별도로 컴파일 한 "장치"를 Turbo Pascal 4.0에 추가 할 때 헤더 파일의 필요성을 제거하기 위해 *.TPU
Turbo C 대신 새로운 형식 을 사용하기로했습니다 *.OBJ
.