C ++ 헤더 파일을 싫어하면 어떻게해야합니까?


25

나는 항상 헤더 파일에 대해 혼란 스러웠다. 그들은 너무 이상합니다 : .cpp를 포함하지 않지만 .cpp도 어떻게 든 컴파일 된 .h 파일을 포함시킵니다.

최근에 팀 프로젝트에 참여했으며 물론 .h와 .cpp가 모두 사용됩니다.
나는 이것이 매우 중요하다는 것을 이해하지만, 우리가 가진 여러 클래스 각각에서 모든 함수 선언을 복사하여 붙여 넣을 수는 없습니다.

2 파일 규칙을 효율적으로 처리하려면 어떻게합니까?
그에 도움이되는 도구가 있습니까, 아니면 아래 예와 같은 파일 하나를 .h 및 .cpp로 자동 변경합니까? (특히 MS VC ++ 2010)

class A
{
...
    Type f(Type a,Type b)
    {
        //implementation here, not in another file!
    }
...
};

Type f(Type a)
{
     //implementation here
}
...

8
이 질문은 몇 가지 방법이 될 수 있습니다. "c ++를 사용할 때 왜 헤더가 필요합니까?"또는 "컴파일하려는 현대 언어가 헤더를 사용해야한다고 생각하십니까?" 제목에는 '무엇을해야합니까?'와 '증오'가 표시되어 많은 플래그를 설정합니다.
Tim Post

4
귀하의 질문은 C ++을 이해하지 못하는 것처럼 보이거나 사용하는 시스템이 어떻게 컴파일합니까? 올바르게 사용하는 법을 배우고 더 주관적인 질문을하십시오.
David Thornley

31
첫 번째 문장은 "헤더에 대한 모든 것을 이해하지 못함"을 나타냅니다. .h 파일을 포함한다고해서 해당 .cpp 파일이 "어떻게 컴파일 되"는 것은 아닙니다. .cpp 파일은 자체적으로 독립적으로 컴파일합니다. 해당 .cpp를 컴파일하지 않은 경우 해당 오브젝트 파일없이 헤더를 포함하면 링커가 실패합니다.
Paul Butcher

5
무엇을해야합니까? 당신이 그렇게 많은 버그를 다른 언어를 찾으십시오.
Paul Nathan

5
"복사 붙여 넣기로 살 수 없음"정보 : 함수를 업데이트 할 때마다 해당 함수를 호출 한 모든 위치를 업데이트해야합니다. 호출자가 헤더 파일의 선언보다 찾기가 훨씬 어려우므로 헤더 업데이트는 사소한 세부 사항입니다.
Sjoerd

답변:


15

더 리팩토링 친화적 인 C ++ 작성

C ++에서 당신은하지 않습니다 전혀 헤더를 사용 할 수 있습니다. C # 또는 Java에서와 마찬가지로 전체 파일을 하나의 파일로 정의 할 수 있습니다. C 개발자는 일반적으로 헤더 파일에 외부 호출 만 유지합니다. 모든 내부 호출은 .c 파일에 정의됩니다. 같은 토큰으로 클래스 / 인터페이스 (순수한 가상 추상 클래스) 등을 위해 C ++ .h 파일을 예약 할 수 있습니다. DLL 외부에서 공유하도록되어 있습니다. 내부 클래스 / 구조 / 인터페이스 등의 경우 필요한 .cpp 파일을 포함하면됩니다.

#include<myclass.cpp>

이것은 가장 보편적 인 접근 방식은 아니지만 합법적 인 C ++입니다. 내부 코드가 모두 가능할 것입니다. 이를 통해 내부 코드 및 클래스 세트가 훨씬 급격하게 변경되는 동시에 라이브러리 외부의 코드 / 실행 가능한 코드와 상호 작용할 수있는보다 안정적인 인터페이스를 제공합니다.

수업 전체를 하나의 파일에 포함 시키면 원하는 것을 쉽게 수행 할 수 있습니다. 메소드의 이름을 바꾸고 메소드가 호출되는 모든 위치를 검색해야하는 문제를 해결하지는 않지만보다 이해하기 쉬운 오류 메시지가 있는지 확인합니다. 헤더가 메소드를 한 가지 방법으로 선언하는 것보다 나쁜 것은 아니지만 다르게 구현합니다. 헤더 파일을 호출하는 다른 코드는 올바르게 컴파일되며 링크 예외가 발생하지만 구현 파일은 메소드가 정의되지 않았다고 불평하는 코드입니다. 실제 클래스 선언에서 모든 메소드를 정의하면 파일에 포함 된 파일에 관계없이 동일한 오류 메시지가 표시됩니다.

이 질문을보고 싶을 수도 있습니다 : C ++ 용 리팩토링 도구

C / C ++가 헤더 / 구현 파일을 해결하는 방법

기본 C 수준에서 (그리고 C ++은 해당 기반을 기반으로 함), 헤더 파일 은 컴파일러가 객체 파일을 생성 할 수있을 정도로 함수 / 구조 / 변수 의 가능성 을 선언 합니다. 마찬가지로 C ++ 헤더 파일은 함수, 구조체, 클래스 등의 약속을 선언합니다. 컴파일러에서 스택 등의 공간을 예약하는 데 사용하는 것은이 정의입니다.

.c 또는 .cpp 파일은 구현되어 있습니다. 컴파일러가 각 구현 파일을 객체 파일로 변환 할 때 구현되지 않은 개념 (헤더에 선언 된 개념)에 연결됩니다. 링커는 다른 객체 파일의 구현에 후크를 연결하고 모든 코드 (공유 라이브러리 또는 실행 파일)를 포함하는 더 큰 바이너리를 만듭니다.

VS 특정

Visual Studio에서 작업하는 것과 관련하여 작업을 좀 더 쉽게 해주는 마법사가 있습니다. 새 클래스 마법사는 일치하는 헤더 및 구현 파일 쌍을 작성합니다. 새로운 메소드를 선언 할 수있는 클래스 브라우저 기능도 있습니다. 헤더의 정의와 .cpp 파일의 구현 스텁을 주입합니다. Visual Studio는 10 년 이상 이러한 기능을 가지고 있습니다 (사용한 한).


문제는 새로운 기능을 추가하는 것뿐만 아니라 클래스를 항상 많이 수정하는 것입니다.
Oleh Prypin

5
@BlaXpirit : 왜 클래스를 항상 많이 수정하고 있습니까? OO 디자인의 아이디어 중 하나는 상당히 안정적인 빌딩 블록을 갖는 것입니다. 클래스를 많이 수정하는 경우 Common Lisp 또는 Python과 같은 더 역동적 인 언어를 원합니다.
David Thornley

2
그게 내가하고있는 일입니다. 저는 "빌딩 블록"을 개선 / 수정하고 새로운 것을 추가하고 있습니다
Oleh Prypin

C ++은 친숙한 리팩토링을 해 본 적이 없습니다. 리팩토링의 개념은 Java IDE에서 쉽게 수행 할 수있는 도구가있을 때까지 추진력을 얻지 못했습니다. 참고 : 이러한 기능은 스몰 토크 개발자 및 기타 언어를위한 것이었지만 많은 사람들이 사용할 수있을 때까지는 주류가되지 않았습니다. 지금까지 나는 누군가 C ++을 지능적으로 구현하는 것을 아직 보지 못했습니다. JetBrains의 Resharper일까요? C # 및 VB 코드를 수행한다는 것을 알고 있지만 C ++ 리팩토링을 제공하는지 확실하지 않습니다.
Berin Loritsch

@Berin : 1 ~ 2 년 전에 C ++ 리팩토링 도구를 찾고 두 가지를 발견했습니다. 당시에는 가격이 꽤 비싸서 평가판을 보지 못했기 때문에 그들이 한 일을 모르겠습니다. 또한 emacs 만 사용하여 Visual Studio 상점의 효율성을 제한했습니다.
David Thornley

13

Java 개발자가 되십시오.

C ++로 계속 개발해야한다면 IDE를 사용해 볼 수 있습니다. 종종 메소드를 클래스에 추가 할 수있는 메커니즘을 제공하며 선언을 .h 파일에, 정의를 .cpp 파일에 자동으로 배치합니다.


2
kthx, 나는 다소 Java를 알고 있지만, 저수준 Win32 DLL을 만들 수는 없습니까?
Oleh Prypin 2016 년

41
왜 그런지 모르겠지만 'Java 개발자되기'는 어떻게 든 모욕적 인 것처럼 들립니다.
Oliver Weiler

2
저수준을하고 싶다면 '쉬운 언어'에 관한 모든 것을 잊어 버리십시오. 낮은 수준의 땀과 눈물.
Batibix

5
특별히 도움이되지 않는 답변입니다.
ChrisF

1
@OliverWeiler 나는 "자바 개발자가되었다"고 모욕으로 인식하지 않습니다. 나는 C ++과 Java로 프로그래밍하지만, 내가 선호하는 코드 (보다 휴대하기 쉬운 코드)를 작성하는 것이 훨씬 쉽기 때문에 내가 선호하는 것은 Java입니다. 어떤 이유로 든 헤더 파일의 존재를 혐오한다면 Java를 시도하는 것이 올바른 선택 일 수 있습니다 (헤더 파일을 싫어하는 것이 이상하지만 IDE의 변경을 고려할 것입니다).
Trixie Wolf


4

새 클래스의 첫 줄을 쓰면 대개 한 번에 한 장소에서만 필요하기 때문입니다. 나중에 더 많은 곳에서 사용될 수 있지만 처음에는 그렇지 않습니다.

많은 클래스가 현재 .cpp 파일의 맨 위에서 시작합니다. 여러 곳에서 사용하기에 충분히 안정화되면 머리글에 잘라 붙여 넣습니다. 종종 클래스가 나타난 것처럼 빨리 사라집니다.


-1

C ++ 헤더 파일을 처리하는 데 도움이되는 제안으로 "GCC"라이브러리와 같이 파일 확장자 나 파일 접미사없이 파일을 사용하는 것이 일반적입니다.

이 경우 " .hpp"(또는 " .hxx") 파일 확장자 또는 파일 접미사 를 사용하는 것이 좋습니다 .

컴파일러, 개발자 환경 또는 빌드 된 프로그램을 구성해야 할 수도 있습니다.


3
당신은 같은 파일을 포함시킬 때 어떻게 이야기하고 #include <iostream>있습니까? 그것들은 GCC 라이브러리만을위한 것이 아닙니다. 실제로 1997 C ++ 표준 섹션 17.3.1.2에 정의되어 있습니다. 그런 파일의 이름을 지정하지 마십시오. C ++ 표준 라이브러리가 수행 한 이유는 이름 충돌을 피하기위한 것일 수 있습니다. 헤더를 포함 할 때 컴파일러가 자동으로 '.h'를 추가하면 실제로 이상하게 느껴집니다. 그리고 나는 C ++ 표준 라이브러리를 제외하고 접미사가없는 이름 헤더를 보지 못했습니다.
vedosity

1
또한, 내가 너무 싫어하는 borland를 제외하고 내가 사용한 모든 컴파일러는 시도 할 때 자동으로 '.h'또는 '.hpp'또는 '.hxx'를 추가하지 않습니다. 접미사가없는 파일을 포함합니다. 모든 컴파일러에서 #include <someclass>읽을 수있는 것은 아닙니다 #include <someclass.hpp>. 코드가 깨질 것입니다.
vedosity
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.