C 코딩 스타일 가이드 - 이름 규칙

반응형

본 문서는 소프트웨어 개발 시 준수해야 하는 코딩 스타일을 정의하고 가이드한다.

본 문서의 가이드는 C 언어를 대상으로 하고 있으며 C99 표준이 적용된다(추후 C11 등 최신 표준으로 변경 적용 가능하며, 이에 따라 본 문서의 내용이 일부 변경될 수 있다).

본 문서의 가이드는 구글 C++ 코딩 스타일 가이드(https://google.github.io/styleguide/cppguide.html)를 기반으로 내부적인 필요에 따라 일부 내용을 수정, 변경하여 적용한 것이다.

 

이름 규칙

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

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

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

 

일반

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

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

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

// 좋은 예
int price_count_reader;  // 축약 없음.
int num_errors;  // 누구나 이해 가능
int num_dns_connections;  // DNS 정도면 누구나 이해 가능

// 나쁜 예
int n;  // 의미 없음.
int nerr;  // 모호한 축약.
int n_comp_conns;  // 모호한 축약.
int wgc_connections;  // 내부자만 아는 약어.
int pc_reader;  // pc의 의미는?
int cstmr_id;  // 중간 단어 축약

 

 

파일 이름

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

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

// 사용 가능한 파일 이름
my_useful_class.c
my-useful-class.c
myusefulclass.c
myusefulclass_test.c

 

N-3. 이미 존재하는 파일 이름은 사용하지 않는다. (errno.h 등)

 

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

예를 들면 http_server_logs.h가 logs.h보다 좋다. 

 

N-5. 인라인 함수는 헤더 파일에 정의한다. 

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

url_table.h  // 헤더 파일
url_table.c  // 모듈 파일
url_table-inl.h  // 많은 코드를 포함한 인라인 함수 헤더 파일

 

디렉터리 이름

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

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

 

타입 이름

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

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

// 구조체
struct UrlTablePropertiesStruct 
{ 
  ...
}

// typedef
typedef struct UrlTablePropertiesStruct * UrlTableProperties;

// 열거형
enum eUrlTableErrors 
{ 
  ...
};

 

 

변수 이름

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

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

int table_name;  // 좋음 - 언더바 사용
int tablename;   // 좋음 - 모두 소문자
int tableName;   // 불가 - 대문자 사용

 

N-9. 전역변수는 "g_" 와 같이 지역 변수와 구분할 수 있는 접두어를 사용한다.

int g_table_num; 

 

상수 이름

N-10. 상수 이름은 k로 시작하고, 대소문자가 섞인 형태(매 단어의 첫 글자를 대문자)를 사용한다. 

const int kDaysInAWeek = 7;

 

함수 이름

N-11. 함수 이름은 대문자로 시작하고 각 단어의 첫 글자를 대문자로 쓰며, 언더바 "_" 는 사용하지 않는다.

AddTableEntry()
DeleteUrl()

 

열거형 이름

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

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

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

enum eResultCode 
{
  kResultSuccess,
  kResultFail
};
typedef uint16_t ResultCode;

enum eStatusCode 
{
  kStatus_Init,
  kStatus_Run
};
typedef int StatusCode;

 

 

매크로 이름

N-13. 매크로 정의는 대문자와 언더바 "_"만 사용하고, 값, 수식 등을 정의할 때에는 반드시 괄호를 사용해야 한다.

#define ROUND(x) ...
#define PI_ROUNDED (3.0)

 

이름 규칙의 예외

N-14. 표준 기술을 구현하는 경우, 해당 표준 문서 상의 표현과 통일성을 갖기 위해 표준 문서 상에 정의된 이름/형태를 그대로 사용할 수 있다.

// 표준에 정의된 프리미티브 형식
DATA-TX.request {
  Data,
  Length
}

// 구현
DATA_TX_request (char *Data, int Length)

 

N-15. 동일한 도메인에 속한 다른 사람이 쉽게 이해할 수 있는 이름의 경우, 약어를 사용할 수 있다.

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

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

// MAC Protocol Data Unit의 약어 = MPDU

uint8_t mpdu[]; // 변수 이름에서는 모두 소문자로 사용
int ConstructMPDU(uint8_t *payload); // 함수 이름에서는 모두 대문자로 사용

 

기타

상식적이고 일관성있게 작성한다.

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

 

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


 

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

댓글

Designed by JB FACTORY