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

[ Coding Style Guide ] 01. C언어 - 이름규칙

kim.svadoz 2021. 1. 8. 10:13
반응형

아래는 소프트웨어 개발 시 준수해야 하는 코딩 스타일을 정의하고 가이드한다. C언어를 대상으로 하고 있으며 C99표준이 적용된다. ( 추후 C11 등 최신 표준으로 변경 적용 가능하며, 이에 따라 본 문서의 내용이 일부 변경될 수 있다.)

해당 가이드는 구글 C++ 코딩 스타일 가이드를 기반으로 필요에 따라 일부 내용을 수정, 변경하여 적용하였다.

  • 이름규칙

    일관성을 위해 가장 중요한 것은 이름 규칙을 따르는 것이다.

    이름의 스타일을 통해 요소의 선언을 찾지 않고도 해당 요소가 타입인지, 변수인지, 함수인지, 상수인지, 혹은 매크로인지 바로 알 수 있다.

    이름 규칙은 개인의 선호도보다 일관성이 더 중요하다. 합리적이라고 생각하든 아니든 규칙은 지켜야 한다.

  • 일반

    • 함수 이름, 변수 이름, 파일 이름은 약어를 사용하지 않고 서술형으로 짓는다.

      가능한 상세한 이름을 사용한다. 다른사람이 즉시 이해할 수 있는 것이 글자 길이를 줄이는 것보다 중요하다.

      제 3자에게 익숙하지 않은 약어를 사용하지 않으며, 축약하지 않는다.

    // 좋은 예
    int price_count_reader;    // 축약 없음.
    int num_errors;    // 누구나 이해 가능
    int num_dns_connections; // DNS 정도면 누구나 이해 가능
    
    // 나쁜 예
    int n; // 의미 없음
    int nerrr; // 모호한 축약
    int n_comp_conns; // 모호한 축약
    int wgc_connections; // 내부자만 아는 단어
    int pc_reader; // pc의 의미는..?
    int cstmr_id; // 중간 단어 축약
  • 파일이름

    • 파일 이름은 모두 소문자로 구성하고 대시 "-"를 포함할 수 있다.

      단, 특정 프로젝트 내에서 대시 "-" 대신 언더바 "_"를 사용하는 경우, 해당 프로젝트의 관례에 따라 언더바 "_"를 사용할 수 있다.

    // 사용 가능한 파일 이름
    my_useful_class.c
    my-useful-class.c
    myusefulclass.c
    myusefulclass_test.c
    • 이미 존재하는 파일 이름은 사용하지 않는다.(errno.h 등)

    • 파일 이름은 되도록 상세하게 짓는다.

      예를 들면 http_server_logs.hlogs.h보다 좋다.

    • 인라인 함수는 헤더 파일에 정의한다.

      인라인 함수의 코드가 짧으면 .h 헤더 파일 안에 정의하고, 길다면 -inl.h 헤더 파일 안에 정의한다.

    url_table.h    // 헤더파일
    url_table.c // 모듈파일
    url_table-inl.h // 많은 코드를 포함한 인라인 함수 헤더 파일
  • 디렉터리 이름

    • 디렉터리 이름은 모두 소문자로 구성하고 대시 "-"를 포함할 수 있다.

      단, 특정 프로젝트 내에서 대시 "-" 대신 언더바 "_"를 사용하는 경우, 해당 프로젝트의 관례에 따라 언더바 "_"를 사용할 수 있다.

  • 타입 이름

    • 타입 이름은 대문자로 시작하며, 언더바 "_" 없이 단어마다 첫 글자를 대문자로 작성한다.

      구조체, typedef, 열거형을 포함한 모든 타입에 대해 동일한 규칙이 적용된다.

    // 구조체
    struct UrlTablePropertiesStruct 
    {
        ...    
    }
    
    // typedef
    typedef struct UrlTablePropertiesStruct * UrlTableProperties;
    
    // 열거형
    enum eUrlTableErrors
    {
        ...
    };
  • 변수 이름

    • 변수 이름은 모두 소문자로 작성하며 단어 사이에 언더바 "_"를 사용한다.

      지역변수, 전역변수, 구조체 멤버 변수 모두 동일한다.

    int table_name;    // 좋음 - 언더바 사용
    int tablename;    // 좋음 - 모두 소문자
    int tableName;    // 불가 - 대문자 사용
    • *전역변수는 "g_"와 같이 지역 변수와 구분할 수 있는 접두어를 사용한다.
    int g_table_num;
  • 상수 이름

    • 상수 이름은 k로 시작하고, 대소문자가 섞인 형태(매 단어의 첫글자를 대문자)를 사용한다.
    const int kDaysInAWeek = 7;
  • 함수 이름

    • *함수 이름은 대문자로 시작하고 각 단어의 첫글자를 대문자로 쓰며, 언더바 "_"는 사용하지 않는다.
    AddTableEntry()
    DeleteUrl()
  • 열거형 이름

    • 열거형 이름은 접두어 "e"를 붙이고, 각 단어의 첫 글자를 대문자로 쓰며 언더바 "_"는 사용하지 않는다.

      열거형 정의 코드 바로 밑에 해당 열거형의 변수 타입 및 이름을 재지정(typedef)하고, 코드상에서는 재 지정된 열거형 이름을 사용한다.

      각 열거형 값은 상수 이름 형식으로 작성하며, 필요시 공통 접두어와 각 값의 의미 구문을 언더바 "_"로 구분할 수 있다.

    enum eResultCode
    {
        kResultSuccess,
        kResultFail
    };
    typedef unit16_5 ResultCode;
    
    enum eStatusCode
    {
        kStatus_Init,
        kStatus_Run
    };
    typedef int StatusCode;
  • 매크로 이름

    • 매크로 정의는 대문자와 언더바 "_"만 사용할 수 있고, 값, 수식 등을 정의할 때에는 반드시 괄호를 사용해야 한다.
    #define ROUND(x) ...
    #define PI_ROUNDED (3.0)
  • 이름 규칙의 예외

    • 표준 기술을 구현하는 경우, 해당 표준 문서 상의 표현과 통일성을 갖기 위해 표준 문서 상에 정의된 이름/형태를 그대로 사용할 수 있다.
    // 표준에 정의된 프리미티브 형식
    DATA-TX.request {
        Data,
        Length
    }
    
    // 구현
    DATA_TX_request (char *Data, int Length)
    • 동일한 도메인에 속한 다른 사람이 쉽게 이해할 수 있는 이름의 경우, 약어를 사용할 수 있다.

      변수 이름에 사용되는 약어는 모두 소문자를 사용한다.

      타입 이름, 함수 이름, 상수 이름, 열거형 이름 등에 사용되는 약어는 모두 대문자를 사용한다.

    // MAC Protocol Data Unit의 약어 = MPDU
    
    uint8_t mpdu[];    // 변수 이름에서는 모두 소문자로 사용
    int ConstructMPDU(uint8_t *payload); // 함수 이름에서는 모두 대문자로 사용
  • 기타

    • 상식적이고 일관성있게 작성ㅎ산다.

      코드를 수정하는 경우 잠시 주변의 코드를 살펴 그것의 스타일을 판단하고, 해당 코드와 일관성을 가지도록 작성한다.

    • 이 스타일을 따르지 않는 기존 코드와의 일관성을 유지하기 위해 본 가이드라인을 따르지 않을 수 있다.

가장 중요한 것은 본인 회사/팀 의 관례와 컨벤션을 준수하여 일관성을 유지하는 코드를 작성하는 것이다.

반응형