아래는 소프트웨어 개발 시 준수해야 하는 코딩 스타일을 정의하고 가이드한다. 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.h
가logs.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); // 함수 이름에서는 모두 대문자로 사용
기타
상식적이고 일관성있게 작성ㅎ산다.
코드를 수정하는 경우 잠시 주변의 코드를 살펴 그것의 스타일을 판단하고, 해당 코드와 일관성을 가지도록 작성한다.
이 스타일을 따르지 않는 기존 코드와의 일관성을 유지하기 위해 본 가이드라인을 따르지 않을 수 있다.
가장 중요한 것은 본인 회사/팀 의 관례와 컨벤션을 준수하여 일관성을 유지하는 코드를 작성하는 것이다.
'프로그래밍 언어 > [ Coding Style Guide ]' 카테고리의 다른 글
[ Coding Style Guide ] 05. C언어 - 주석 (0) | 2021.01.20 |
---|---|
[ Coding Style Guide ] 04. C언어 - 변수범위 (0) | 2021.01.20 |
[ Coding Style Guide ] 03. C언어 - 서식 (0) | 2021.01.20 |
[ Coding Style Guide ] 02. C언어 - 헤더파일 (0) | 2021.01.20 |
[ Coding Style Guide ] 00. 코딩 명명법 (2) | 2021.01.08 |