2017-11-03 1 views
-1

, 나는 다음과 같은 pargraph 클래스의 구현이 변경 될 때 헤더에 완전히 정의 된 클래스를 사용하는 소스 파일을 다시 컴파일해야하는 이유는 무엇입니까? 리프만 책에서 캡슐화에 대한 읽기

클래스를 사용하는 클래스 정의 변경, 소스 파일은 클래스 언제든지에게 변경을 다시 컴파일해야 할 때 사용자 코드가 변경되지 필요하지만

을 발견했다.

내가 그것을 사용하는 소스 파일을 컴파일해야하는 이유는, x+2을 반환 x_plus()의 몸을 변경 한 경우 다음과 같은 코드

class A { 
private: 
    int x; 

public: 
    A() { x = 0; } 

    int x_plus(); 
} 

int A::x_plus(){ return x + 1; } 

이 가정?

저는 이것이 C++에 의한 프로세스 연결과 관련이 있다고 생각합니다. 맞습니까?

+0

귀하의 질문에 맞는 말이 아닙니다. 변경된 모든 코드와 함께 클래스 정의를 다시 컴파일해야합니다. 이 모든 것은 분명하고 자동적입니다. – xyious

+0

@xyious, 내 클래스를 사용할 사용자 코드에 대해 묻습니다. 클래스의 소스 코드가 아닙니다. –

+0

C++ 빌드 도구는 매우 간단한 종속성 검사를 사용하며 소스 파일의 타임 스탬프 만 봅니다. 따라서 인라인 함수 정의를 사용하지 않고 선언을 .h 파일로 유지하고 .cpp 파일로 구현하면 다른 소스 파일이 다시 빌드되지 않습니다. –

답변

3

함수 정의를 클래스 정의 안에 넣으면 기본적으로 인라인 함수로 처리됩니다. 즉, 호출자는 함수 본문을 복사 할 수 있습니다. 정의를 변경하면 호출자는 다시 컴파일하지 않으면 이전 정의를 계속 포함합니다. 당신은 누구의 정의 클래스의 헤더 파일에없는 기능을 변경하는 경우

Function declaration inside or outside the class를 참조하십시오, 당신은 단지 그들을 다시 링크해야, 발신자를 다시 컴파일 할 필요가 없습니다. 이것은 클래스 정의에 대한 변경으로 간주되지 않으므로 Lippman 서적의 견적은 적용되지 않습니다. 이 보는

간단한 방법은 클래스의 코드는 .o 파일로 컴파일 된 가져옵니다 .cpp 파일에있을 것입니다 동안 클래스 정의하는 .h 파일에 있어야한다는 것입니다. .h 파일을 변경하면 <include filename.h>이 들어있는 파일을 다시 컴파일해야합니다. .cpp 파일을 변경하면 .o 파일을 다시 컴파일하고이를 사용하는 실행 파일을 다시 링크합니다. 응용 프로그램 빌드 도구 (예 : Unix의 경우 make)가 자동으로 처리해야합니다.

+0

LTO를 사용하고 있다면 인라인으로 정의되지 않은 경우에도 여전히 이러한 현상이 발생할 수 있습니다. –

+0

예제를 직접 추가 했으므로 예제의 의미가 변경된 것 같습니다. 인라인 함수가없는 또 다른 상황 가정 (클래스 외부에서 정의 된 함수의 구현 변경) –

+0

클래스 정의 외부의 비 인라인 함수 구현을 변경하면 호출자를 다시 컴파일 할 필요가 없으며 클래스의'.o' 파일에 다시 링크하십시오. – Barmar

관련 문제