Header Files
일반적으로 모든 .cc 파일에는 연관된 .h 파일이 있어야 한다.
- 단, 유닛 테스트 및 main() 함수만 포함하는 작은 .cc 파일과 같은 예외가 있음
헤더 파일을 올바르게 사용하면 코드의 가독성, 사이즈 및 성능 면에서 큰 차이를 가져올 수 있다.
Self-contained Headers
모든 헤더 파일은 독립적(self-contained)이어야 한다.
- 여기서 독립적이란, abc.h, abc.cpp따로 파일을 만들어야 한다는 의미이다.
- 단, template, inline function 에 대한 정의는 선언과 동일한 파일에 배치하는 걸 선호
The #define Guard
모든 헤더 파일에는 다중 포함을 방지하기 위해 #define 이 있어야 한다.
기호 이름의 형식은 PROJECT_PATH_FILE_H_ 여야 한다.
고유성을 보장하려면 프로젝트 소스 트리의 전체 경로를 기반으로 해야 한다.
예를 들어, foo 프로젝트의 foo/src/bar/baz.h 파일에는 아래와 같이 작성한다.
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif // FOO_BAR_BAZ_H_
Include What You Use
소스 또는 헤더 파일이 다른 곳에 정의된 기호를 참조하는 경우, 파일에는 해당 기호의 선언 또는 정의를 적절하게 제공하려는 헤더 파일이 직접 포함되어야 한다.
즉, 전이적 포함(transitive inclusion)에 의존하면 안된다.
//foo.h
#include "bar.h"
class Foo
{
public:
Bar bar;
};
//bar.h
class Bar
{
};
//foo.cc
#include "foo.h"
// #include "bar.h"
int main()
{
Foo* foo = new Foo();
Bar* bar = new Bar();
}
- foo.h 가 bar.h를 포함하기에 .cc 파일에서 foo.h 만 포함하려는 시도
Forward Declaration
가능하면 전방 선언을 사용하지 않는다.
- 대신 필요한 헤더 파일을 포함해야 함
- C++ 20 부터는 모듈 시스템의 도입으로 문제점이 완화되었음
Inline Functions
10줄 이하의 함수는 인라인으로 정의한다.
- loop 또는 switch 의 경우 효율적이지 않음
- 재귀 함수는 인라인으로 지정하지 않음
Names and Order of Includes
다음의 순서로 포함한다 :
관련 헤더, C 시스템 헤더, C++ 표준 라이브러리 헤더, 기타 라이브러리 헤더, 프로젝트 헤더
프로젝트의 모든 헤더 파일은 UNIX 디렉터리 별칭 .(현재 디렉터리) 또는 ..(상위 디렉터리)를 사용하지 않고 프로젝트 소스 디렉터리의 하위 항목으로 나열되어야 한다.
예시 1. google-awesome-project/src/base/logging.h 는 다음과 같이 포함되어야 한다.
#include "base/logging.h"
예시 2. google-awesome-project/src/foo/internal/fooserver.cc는 다음과 같을 수 있다:
#include "foo/server/fooserver.h" #include <sys/types.h> #include <unistd.h> #include <string> #include <vector> #include "base/basictypes.h" #include "base/commandlineflags.h" #include "foo/server/bar.h"
예외 1. 조건부 포함
#include "foo/public/fooserver.h" #include "base/port.h" // For LANG_CXX11. #ifdef LANG_CXX11 #include <initializer_list> #endif // LANG_CXX11
'CSE > 알쓸모' 카테고리의 다른 글
Google C++ Style Guide 정리하기 - Functions (0) | 2025.03.02 |
---|---|
Google C++ Style Guide 정리하기 - Classes (2) | 2025.03.01 |
어도비(adobe) 조기 취소 수수료 안내고 싶은데. (0) | 2025.02.28 |
Google C++ Style Guide 정리하기 - Scoping (0) | 2025.02.28 |
Google C++ Style Guide 정리하기 - 시작 (0) | 2025.02.24 |