프로그래밍 언어/[ Coding Style Guide ]

[ Coding Style Guide ] 02. C언어 - 헤더파일

kim.svadoz 2021. 1. 20. 17:35
반응형

헤더파일

헤더파일을 바르게 사용하는 것으로 코드의 가독성과 크기, 성능에 큰 차이를 만들 수 있다.

  • define guard

    • 헤더파일이 중복 포함되는 것을 방지하기 위해, 모든 헤더파일 내에 #define 가드를 사용한다

      #define 가드의 형식은 <PROJECT>_<PATH>__<FILE>_H_이며, <PATH>는 프로젝트 소스 디렉토리로부터의 하위경로로 표시된다.

      // foo/src/bar/baz.h
      
      #ifndef FOO_BAR_BAZ_H
      #define FOO_BAR_BAZ_H
      
      #endif // FOO_BAR_BAZ_H
  • 인라인 함수

    • 10줄 이하이면서 for, while, switch 문을 포함하지 않은 함수만 인라인 함수로 정의한다.
  • -inl.h 파일

    • 복잡한 인라인 함수의 정의로 인해 헤더파일이 지저분해질 경우, 인라인 함수만 정의하는 -inl.h 접미어가 붙은 헤더파일을 추가로 사용한다.
  • 함수 인자 순서

    • 함수의 인자는 입력 인자, 입출력 인자, 출력 인자 순서로 정의한다.

      단순히 새로운 변수라고 해서 가장 뒤에 추가하지 않는다.

      단, 관련된 함수들과의 일관성을 위해 이 규칙을 따르지 않을 수 있다.

  • include 형식

    • 시스템 라이브러리 및 다른 라이브러리의 헤더파일을 include할 때는 "<", ">"를 사용한다.

    • 현재 프로젝트의 헤더파일을 include할 때는 쌍 따옴표(")를 사용한다.

    • 모든 프로젝트 헤더파일은 현재 디렉터리 기준의 상대경로 ".", ".."를 사용하지 않고, 프로젝트 소스 디렉토리 기준의 하위경로로 표시한다.

      ex) google-awesome-project/src/base/logging.h는 다음과 같이 #include된다.

      #include "base/logging.h"
  • include 순서

    • include하는 헤더파일의 순서는

      1. 시스템 라이브러리의 헤더파일(들)
      2. 다른 라이브러리의 헤더파일(들)
      3. 현재 프로젝트의 헤더파일(들)

      의 순서로 구역을 나누어 작성하며, 각 구역 내 헤더파일의 순서는 알파벳 순서를 따른다

      이를 통해 가독성을 높이고 숨겨진 종속성을 피할 수 있다.

      ex) google-awesome-project/src/foo/internal/fooserver.c

      // 1) 시스템 라이브러리
      #include <sys/types.h>
      #include <unistd.h>
      
      // 2) 다른 라이브러리
      #include <other_libs.h>
      
      // 3) 현재 프로젝트
      #include "base/basictypes.h"
      #include "base/commandlineflags.h"
      #include "foo/public/bar.h"

      예외) (시스템 의존적인) 조건부 include는 가장 아래에 작성한다.

      #include "base/port.h" // LANG_CXX11를 위해
      
      #ifdef LANG_CXX11
      #include <initializer_list>
      #endif // LANG_CXX11
반응형