2013-09-28 4 views
2

헤더 파일에 클래스의 함수를 정의하는 것은 나쁜 습관입니까?C++의 헤더 파일에있는 인라인 함수

headerfile.hpp

#ifndef _HEADER_FILE_ 
#define _HEADER_FILE_ 

class node{ 
int i; 

public: 
int nextn(){ 
...... 
return i; 
} 
} 

#endif //_HEADER_FILE_ 

그래서이 만드는 같은 클래스의 함수를 정의, 내가 헤더 파일을 가지고 있고이 클래스 정의 자체 등에 클래스의 함수를 정의 말할 수 있습니다 함수 "인라인". 그래서 우리는이 헤더 파일을 두 개의 .cpp 파일에 포함 시키면 "다중 정의 오류"가 발생합니까 ?? 클래스 정의에서 이와 같은 함수를 정의하는 것은 나쁜 습관입니까?

답변

2

실제로는 좋지 않습니다 (실제로는 일반적입니다). 다중 정의 오류가 발생하지는 않습니다. 인라인 함수는 다중 정의 오류를 발생시키지 않습니다. 이는 인라인의 의미 중 하나입니다.

+0

그래서 함수가 작다면 이처럼 헤더 파일에 함수를 정의하는 데 아무런 문제가 없습니까? – starkk92

+0

@ starkk92 나는 그것에 동의 하겠지만, 그것은 스타일 일이기 때문에 다른 사람들이 동의하지 않을 수 있습니다. – john

+0

질문에 'inline'에 대한 언급이 없으므로 * inline *과'inline'을 더 명확하게 구분할 수 있습니다. –

0

hpp 파일에 (인라인) 함수를 정의하는 것이 합법적입니다. 어떤 사람들은 "inl.hpp"와 같은 전용 확장자를 모으는 것을 선호하지만 이는 단지 스타일 선호도 일뿐입니다.

0

특별히 템플릿 클래스/메소드를 작성하는 것은 좋지 않습니다.

inline ing 메소드를 사용하면 하나의 정의 규칙을 따르는 데 도움이됩니다.

템플릿 클래스의 경우 헤더 파일에 inline 개의 메소드를 지정해야합니다. inline -ing을 피하기 위해 템플릿을 명시 적으로 인스턴스화 할 수도 있습니다.

나쁜 일에 대한 inline 방법은, 각 inline -ed 방법을 수정 한 후에 그 방법을 사용하는 모든 장치를 다시 재 컴파일 할 필요가있다, 그러나 당신이 .cpp 파일 컴파일러를 이동하면 오브젝트 파일을 만들고이를 다시 사용할 수 있습니다 많은 번역 단위.

inline 구현 여부를 결정할 수 있습니다 (가능한 경우).

1

프로토 타입 (즉, 클래스, 함수, 유형의 선언)을 구현에서 분리하는 규칙은 디자인과 성능 관점에서 나옵니다.

  • 귀하의 부양 가족을 확인하고 작성하는 유형이 저렴합니다. 클래스를 사용하는 무언가는 구현을 모른 채 안전하게 컴파일 될 수 있습니다.

  • 컴파일러는 해당 종속 변수를 컴파일 할 때마다 동일한 정보를 여러 번 구문 분석하고 다시 컴파일 할 필요가 없습니다.

것은 당신이 C++에서 파일의 상단에 #include 쓰기로 정말 무엇을 의미하는지 기억하는 것입니다. "다른 파일의 모든 내용을, 여기에 넣어"뜻 따라서 코드 기반의 모든 곳에서 클래스를 사용한다면 매번 구문 분석이 이루어지고 해당 컴파일 단위의 컨텍스트에서 다시 컴파일됩니다.당신이 템플릿 클래스 인라인 (in-line) 헤더 파일의 넣어 구현에이 이유

정확하게 이유이다; 컴파일러 을 필요로합니다. 왜냐하면 모든 다른 템플릿 인스턴스화에 대한 클래스를 다시 구문 분석하고 컴파일하기 때문입니다.

직접 질문에 답변하려면 * 아니요, 다중 정의 오류가 발생하지 않습니다. * 어쩌면 어떤 사람들은 디자인의 관점에서 다시 연습한다고 생각할 것입니다 (다른 사람들은 그렇지 않을 것입니다). * 성능 차이를 볼 수 있습니다 (필연적 인 것은 아닙니다.), 위의 경우에도 헤더 전용 라이브러리를 컴파일하는 것이 더 빠를 수 있습니다.

구현이 길고 클래스가 코드베이스에서 자주 사용되며 자주 변경되는 경우이를 피하는 것이 좋습니다.

자세한 내용은 "미리 컴파일 된 헤더"를 확인해 보는 것이 좋습니다.

5

다음과 같은 이유로 나쁜 습관입니다. 코드를 변경해야하는 경우 간단한 설정 도구 (흔히 .h에 있음)에 추적을 추가한다고 가정 해 봅니다. 변경 사항 (및 그 종속성)을 # 포함하는 모든 CPP 파일을 다시 컴파일해야합니다. 내 현재 프로젝트에서 최대 1 시간까지 손실 될 수 있습니다. 나중에 다른 트레이스를 추가해야하는 경우 다른 트레이스를 추가해야하는 경우 1-2 일이 빠르거나 컴파일러를 기다리는 작업이 필요합니다.

코드를 CPP에 넣으면 다시 연결하기 만하면됩니다. 단 몇 분만 걸립니다. 귀하의 프로젝트는 오늘날 작지만 몇 년 안에 누가 알 수 있습니다. 취할 좋은 습관 일뿐입니다.

또 다른 (그리 좋지 않은) 이유는 코드베이스에서 ":: MyFonction"문자열을 검색하면 "::"(구현 만 필요함)가 없기 때문에 선언에서 찾을 수 없다는 것입니다. 하지만 좋은 IDE는 어쨌든 문자열 검색 대신 컨텍스트 검색을 사용해야합니다.