2009-05-17 1 views
1

상황 : header.h가에서두 개 이상의 .cpp 파일이 #include되면 어떻게됩니까? 이런 내가 본 (및 사용) 한 Becase

: def.cpp에서

class point 
{ 
public: 
    point(xpos, ypos); 
    int x; 
    int y; 
}; 

: MAIN.CPP에서

#include"header.h" 
point::point(xpos, ypos) 
{ 
    x = xpos; 
    y = ypos; 
} 

:

#include"header.h" 
int main() 
{ 
    point p1(5,6); 
    return 0; 
} 

나는 main에서 프로그램이 실행된다는 것을 알고 있지만, 컴파일러는 어떻게 r .cpp 파일을 컴파일 하시겠습니까? (특히 둘 이상의 비 .cpp 파일이있는 경우).

답변

10

컴파일러 상관하지 않습니다

#ifndef HEADER_H_ //every header gets it's own name 
#define HEADER_H_ 

바닥에 : 코드 전에 파일의 상단에

, 파일 및 .obj 파일에는 각각 누락 된 기호 목록이 들어 있습니다. 따라서이 경우 main.obj는 "나는 실종되었다. point::point"이라고 말합니다.

그것은 모든 .OBJ 파일을 실행 파일로 함께 결합하고, 각 .OBJ 파일의 누락 된 기호는 다른 .OBJ 파일 중 하나에서 사용할 수 있는지 확인하기 위해 다음 링커의 일이다 - 따라서 용어 "링커".

+0

보통 .o 파일이 아니라 .obj (실제로는 문제가되지 않음). – Zifre

+9

그들은 "보통"아무것도 아닙니다. GCC는 기본적으로 .o 파일을 생성합니다. Visual Studio는 .obj 파일을 생성합니다. 어느 쪽도 다른 쪽보다 "평범"하지 않습니다. – jalf

0

일반적으로 직접 컴파일하거나 (make과 같은 빌드 도구를 사용하여) 개별적으로 컴파일합니다. 헤더 파일을 사용하면 원하는 순서로 컴파일 할 수 있습니다. 함께 컴파일하면 명령은 컴파일러 명령에 전달한 순서 일 가능성이 있지만 실제로 중요하지는 않습니다. 모든 명령은 결국 하나의 실행 파일로 연결됩니다.

1

편집 순서는 중요하지 않습니다. 컴파일러는 .h 파일을 사용하여 사용중인 기호가 최소한 선언되어 있는지 확인합니다. 컴파일러가 완료된 후에 실행되는 링커의 작업으로 메소드 호출을 실제로 구현과 일치시킵니다.

4

두 개의 다른 cpp 파일에 포함 시키면 문제가 없습니다. 동일한 헤더를 두 번 포함하면 중복 정의에 대해 오류가 발생합니다.

이를 피하려면 포함 경비원을 사용해야합니다. 이 .OBJ에 각 .cpp 파일을 컴파일 -

#endif 
+1

나는이 토론에 기여하고 중요한 IMO를 많이 추가하는 중요한 패턴을이 투표에 사용하고 있습니다. – jdt141

+1

아니요 : OP가 여러 CPP 파일을 컴파일하는 순서를 묻습니다. 정답은 컴파일 된 순서가 독립적으로 컴파일되므로 중요하지 않습니다. OP는 헤더 파일이 각 CPP 파일에 포함되는 순서에 대해 묻지 않습니다. – ChrisW

-1

이 때문에 #ifndef HEADER_H 및 #define HEADER_H가 일부 헤더 파일의 맨 위에 표시됩니다. 각 헤더 파일을 하나만 포함하는 개념은 예를 들어 described here입니다.

1

컴파일러는 파일을 cpp를 컴파일하는 순서를 알 필요가 없습니다.

링커 (통화 당에서 구축)을 개별적으로 컴파일 된 .o 인 모든 정렬 밖으로 파일을 하나의 실행 파일로 모든 것을 해결합니다.

0

그래프 이론 응용 프로그램의 예입니다. 컴파일 된 모듈은 모든 코드 블록에 대한 상대 오프셋을 포함하며 실행 파일을 생성하는 동안 종속성 (그래프)을 찾아내는 링커까지의 상대 오프셋을 포함합니다.

관련 문제