2009-05-17 4 views
44

.cpp 파일을 .h 파일로 변환했기 때문에 찾을 수있는 유일한 차이점은 .cpp 파일을 #include 할 수 없다는 것입니다. 제가 누락 된 점이 있습니까?.cpp 파일과 .h 파일의 차이점은 무엇입니까?

+7

실제로 .cpp 파일을 포함 할 수 있습니다. 원하는 것을 넣을 수 있습니다. –

+0

아래 사람들의 답변을 이해하려면 'C++에서'선언 '과'정의 '의 차이점은 무엇입니까?라는 또 다른 질문을해야 할 수도 있습니다. – ChrisW

+1

선언과 정의의 차이점을 알고 있습니다. –

답변

42

C++ 빌드 시스템 (컴파일러)은 차이점을 알지 못하므로 모든 규칙이 있습니다.

.h 파일은 선언이며 .cpp 파일은 정의입니다.

그렇기 때문에 .h 파일은 #include이며 선언문이 포함됩니다.

+0

C++ 빌드 시스템은 차별화됩니다. .h 파일과 .cpp 파일에서 g ++을 실행하고 어떤 일이 발생하는지 확인하십시오. –

+0

.cpp 파일은 .h 파일에서 선언 된 함수/클래스/등을 정의하는 데 (대부분) 사용되지만 .h 파일에서도 변수를 정의 할 수 있다는 것을 알고 있습니다. –

+5

@Neil Butterworth : 예 G ++ 컴파일러는 규칙을 이해하지만 언어를 강제로 컴파일 할 수 있습니다. –

0

규칙에 따라 .h 파일은 다른 파일에 포함되며 절대 직접 컴파일되지 않습니다. .cpp 파일은 다시 말해서 관습에 따라 컴파일 과정의 근원이됩니다. .h 파일은 직접 또는 간접적으로 포함되지만 일반적으로 .cpp 파일은 포함되지 않습니다.

17

.cpp 파일은 컴파일 단위입니다 (C++에서 컴파일 될 실제 소스 코드 파일입니다).

.h (헤더) 파일은 #include 프리 컴파일러 명령어가 나타나는 .cpp 파일에서 사실상 복사/붙여 넣기 될 파일입니다. 헤더 코드가 .cpp 코드에 삽입되면 .cpp의 컴파일이 시작될 수 있습니다.

+0

왜 .cpp 파일이 아니라 .cpp 파일입니까? –

+9

@ Keand64 : 컴파일러는 컴파일 할 때 * .cpp 파일 하나만 찾습니다. .cpp 파일을 읽고 모든 #hincluded .h 파일을 읽고 모든 것을 컴파일하고 .o (또는 .obj) 파일을 작성한 후 다음 .cpp 파일로 진행합니다. –

6

.h 파일 또는 헤더 파일은 클래스 선언의 공개적으로 액세스 가능한 인스턴스 변수 및 메서드를 나열하는 데 사용됩니다. .cpp 파일 또는 구현 파일은 실제로 이러한 메서드를 구현하고 해당 인스턴스 변수를 사용하는 데 사용됩니다.

.cpp 파일이있는 동안 .h 파일이 바이너리 코드로 컴파일되지 않기 때문에 별도의 이유입니다. 예를 들어 도서관을 가져 가라. 당신이 저자이고 그것이 오픈 소스가되기를 원하지 않는다고 가정 해보십시오. 따라서 컴파일 된 바이너리 라이브러리와 헤더 파일을 고객에게 배포합니다. 이를 통해 학생들은 해당 방법을 구현 한 방법을 알지 못해도 사용할 수있는 도서관 수업에 대한 모든 정보를 쉽게 볼 수 있습니다. 그들은 컴파일러가 아닌 코드를 사용하는 사람들을위한 것입니다. 전에 말했듯이, 그것은 대회입니다.

1

다른 사람이 이미 좋은 설명을 제안했다,하지만 난 다양한 확장 기능 사이의 차이점을 명확히해야한다고 생각 : 물론

 
    Source Files for C: .c 
    Header Files for C: .h 

    Source Files for C++: .cpp 
    Header Files for C++: .hpp 

, 이미 지적 된 바와 같이, 이들은 단지 규칙입니다. 컴파일러는 실제로 그 (것)들에게 어떤주의도 지불하지 않는다 - 순전히 코더의 이득을 위해이다.

+3

대부분의 사람들은 실제로 .h를 C++로 사용합니다. – Zifre

+0

@Zifre : 예, 그렇기 때문에 많은 사람들이 그들을 따라갈 수는 없지만 권장되는 명명 규칙 *입니다. – Noldorin

1

좋은 경험 법칙은 ".h 파일에는 여러 소스 파일에서 선언이 있지만 잠재적으로 실행되는 코드가 없어야합니다."라는 것이 좋습니다.

5

헤더 (.h, .hpp, ...) 파일이 포함

  • 클래스 정의 (class X { ... };)
  • 인라인 함수 정의 (inline int get_cpus() { ... })
  • 기능 선언 (void help();)
  • 개체 선언 (extern int debug_enabled;)

소스 파일 (.c , .cpp, .cxx)은

  • 기능 정의 (void help() { ... } 또는 void X::f() { ... })
  • 개체 정의 그러나

(int debug_enabled = 1;)하는 .cpp 접미사가 아닌 함께 헤더라는되어 .h 접미사와 소스 파일 이름을 지정하는 협약 정말 필요합니다. 좋은 컴파일러에게 파일 이름 접미사에 관계없이 (gcc의 경우 -x <file-type>, -x c++과 같이) 어떤 파일을 처리하는 방법을 항상 말할 수 있습니다.

원본 파일에는 전체 프로그램에서 한 번만 나타나야하는 정의가 들어 있습니다. 따라서 소스 파일을 어딘가에 포함시킨 다음 해당 파일의 컴파일 결과와 소스 파일 자체의 파일을 함께 연결하면 링커 오류가 발생합니다. 이러한 정의는 이제 두 번 나타납니다. 포함 된 소스 파일 및 그 파일을 포함하는 파일에서. 그래서 .cpp 파일을 포함하는 데 문제가있었습니다.

12

나는 선언과 정의의 차이점을 안다.

반면 :

  • CPP 파일 헤더 파일이 포함될 수
  • (CPP 헤더 파일이 함께 하나의 '번역 부'되기 때문에)이 포함되어있는 헤더의 정의를 포함 하나 이상의 CPP에 의해 링커는 일반적으로 하나 이상의 CPP 파일에 정의 된 것을 좋아하지 않을 것이다
  • 파일

헤더 파일의 모든 정의는 인라인 또는 정적이어야합니다. 헤더 파일에는 둘 이상의 CPP 파일에서 사용되는 선언이 포함되어 있습니다.

정적 또는 인라인이 아닌 정의는 CPP 파일에 저장됩니다. 또한 하나의 CPP 파일 내에서만 필요하게되는 선언은 해당 CPP 파일 자체 내에 배치되며 다른 어떤 (공유 가능한) 헤더 파일과는 별도로 배치됩니다.

관련 문제