c coding convention
Table of Contents
- 1. Name
- 2. formatting
- 3. goto, continue, break, and ?
- 4. etc
- 4.1. one variable per line
- 4.2. enum 대신 #define 이나 constant 를 사용하자. (!)
- 4.3. 불편한 macro function은 자제하고 inline function을 쓰자
- 4.4. make macro names unique
- 4.5. initialize
- 4.6. 함수는 한 페이지를 넘어가지 않게 짠다.
- 4.7. null statement 도 완전히 비워 놓지 말 것. (!)
- 4.8. condition문에 함수만 덜렁 적지 말고 반드시 값을 받아서 체크!
- 4.9. embededd assignment는 적절히 보기 좋게
- 5. documentation
- 6. miscellaneous 1
- 7. miscellaneous 2
- 8. miscellaneous 3
1 Name
- 이름을 보고 무엇을 하는 변수/함수인지 알 수 있게 한다.
1.1 functon name
- 명사만 적지 말고 동사를 포함한 이름으로 동작을 알 수 있게 한다.
- max, cnt, key 와 같은 접미사, is, get, set 같은 접두사를 잘 쓰자.
1.2 unit name
- 수치를 나타내는 변수에는 그 단위를 함께 적어준다.
1.3 structure name
- 변수 선언 시 타입을 섞어서 선언하지 말고, 같은 타입끼리 연속되게 한다.
- 스트럭쳐는 소스파일의 최상위나 헤더 파일 최상위에 적는다.
- 헤더파일에 적는 경우에는 extern을 사용하도록 하자.
- bit field 를 사용하는 경우에는 같은 라인으로 맞춰서 쓰자.
1.4 variable names on the stack
- lowercase + _
1.5 poineter name
- 포인터 선언시 *은 변수 앞에 딱 붙여서 사용한다.
1.6 global variables
- g_name -> g_ 로 시작
1.7 global constants
- upper case + _
- macro 와 헷갈리지 않도록 이름에 global임을 표시
1.8 macro name
- 모두 대문자 + _
- 우측에 오는 변수들은 모두 괄호로 싸야 하고, 이 괄호 앞 뒤로는 space 적어준다.
- 두 줄 이상의 macro function 은 do {} while (0)으로 감싼다. 이어지는 줄 끝에는 \
1.9 enum names
- upper case + _
- no comma for last element
- enum을 이용해서 에러 코드를 만들자.
1.10 header file guards
- _ something_h_ c++ 에서는 _ 로 시작하는 변수 안됨. 그러니 호환성을 위해서 이런 선언은 하지 말자.
2 formatting
2.1 brace placement
- one line 의 경우 brace 없이 한 줄에 적어도 되고, brace를 넣어서 세 줄에 적어도 된다.
- 다만 통일성 있게 하자.
2.2 add comment to end bracelet
- brace 안 코드에 대한 설명은 brace 끝에 적는다.
2.3 characters in one line
- 한 줄에는 78 charaters 이상 적지 말 것.
2.4 if then else format
- else if, else 같은 경우 이전 조건문의 brace 끝과 한 줄로 적거나 따로 적어도 되지만 통일성 있게.
- comment는 각 brace 끝에 적는다.
- else if 를 쓰는 경우에는 항상 else 를 쓰자.
2.5 condition formatting (!)
if ( 6 == errNum )
- 위와 같이 constant 를 왼쪽에 써준다.
- 간혹 == 과 = 를 실수하는데, 이 경우 에러를 잡을 수 있다.
2.6 switch-case formatting
- default 를 반드시 적어주자
- case 문 안에서 변수를 선언할 경우 반드시 block 으로 싸자.
case 2: { int v; …. } break;
default:
}
3 goto, continue, break, and ?
3.1 goto
- 불가피 한 경우에만 사용하자.
- block header에 반드시 comment 를 적어주고
- label을 쓰는 코드 아래에 적어주자 (?)
3.2 continue and break
- 얘네는 사실 goto 의 변종이다 !
- 얘네도 불가피한 경우에만 쓰는 게 좋다.
- test condition이나, increment/ decrement expression을 건너 뛰지 않도록 주의 !!
3.3 ?
- condition은 괄호로 감쌀 것
- 되도록 간단한 statement를 사용하고 아주 간단하지 않은 이상 라인을 분리 할 것
(condition) ? func1() : func2() ;
(condition) ? long statement anotehr long statement;
4 etc
4.1 one variable per line
- 변수 간 연관관계가 매우 분명한 경우를 제외하고는 한 줄에 정의 하나.
- 그래야 알아보기, comment 달기, 초기화하기 좋다.
4.2 enum 대신 #define 이나 constant 를 사용하자. (!)
- 기본적으로 constant variable을 사용하면 메모리를 많이 차지하기 때문에 deprecated.
- constant variable에 대한 처리는 기본적으로 다르긴 하지만 .. 기본은 공간을 차지함.
- 그리고 enum 은 타입이 없음. int 라는 보장도 없음..
- 그러므로 type이 필요한 경우에는 #define 이나 const 를 사용하자.
const inst var = 5;
#define VAR ((int) 5)
#define VAR 5 int var = VAR;
4.3 불편한 macro function은 자제하고 inline function을 쓰자
#define MAX (x,y) (((x) > (y) ? (x) : (y))
->
inline int
max (int x, int y) {
return (x > y ? x : y);
}
- 매크로는 문자를 그대로 치환해 주는 것.
- inline function은 call-stack에 함수를 쌓아놓고, 함수를 부르는 속도를 빠르게 한다.
- 매크로는 문자 그대로를 치환하는 것이므로 사용 시 매우 주의해야함.
4.4 make macro names unique
- 글로벌 변수와 마찬가지로 패키지 전체에서 공유되므로, 이를 주의해야.
- 간단한 이름을 쓰지말고, 패키지 이름과 함께 적어주어 패키지간 혼란이 생기지 않게 한다.
4.5 initialize
- 항상 초기화 하자.
- -W 플래그 쓰면 uninitialized 잡아 줌.
4.6 함수는 한 페이지를 넘어가지 않게 짠다.
4.7 null statement 도 완전히 비워 놓지 말 것. (!)
while (*dst++ = *src++) {
;
}
- 일부로 비워 놓은 것임을 표시하기 위해 세미 콜론을 넣어 놓음.
4.8 condition문에 함수만 덜렁 적지 말고 반드시 값을 받아서 체크!
if (f(n)) 이렇게 쓰지 말고
if (FAIL != f(n))
4.9 embededd assignment는 적절히 보기 좋게
a++, b–, while (EOF != (c = f(n))) 이런 표현은 좋음.
d = (a = b + c) + r 은 안좋음.
5 documentation
5.1 doxygen같은 통일 된 header, layout을 사용하자
5.2 make gotchas explicit
@author:
@version:
@param:
@return:
@deprecated:
@see:
@todo:
@bug:
5.3 해당 파일에 대한 의미있는 요약을 적을 것.
5.4 작성자, 작성일 반드시 적을 것.
5.5 commenting functions
- .c 파일에 선언된 부분에 적어 놓을 것.
5.6 include statement documentation
- 해당 파일을 왜 포함 시켰는지 적어줘야 함. 커맨트 순서는
6 miscellaneous 1
6.1 floating point variable
- discrte number 가 쓰이는 곳에 함부로 막 쓰지 말 것.
- 특히 for loop 같은 곳.
= !
쓰지 말고 <= >= 를 쓸 것.
6.2 컴파일러 버그
structure assignment, bit field에 버그가 있는 경우가 있다.
6.3 조건문 안에서 변수를 변화 시키는 것은 자제하자
if (abool = bbool)
->
abool = bbool;
if ( abool ) { …}
7 miscellaneous 2
7.1 바뀌지 말아야할 모든 변수에는 항상 const를 붙여주자 (!)
7.2 #ifdef 대신 #if를 쓰자. (!)
cc - lurker.cc -DDEBUG = 0
- 이렇게 컴파일 할 때 매크로 값을 넘겨줄 수도 있는데
- 이 경우 #ifdef 는 정상 동작 안됨… 사람마다 착오가 있을 수도 있는 부분.
- #if 는 DDEBUG가 정의가 안되어 있어도 동작
7.3 commenting out large code blocks
- 큰 블록 커맨트 시 /**/을 쓰면 내부 /**/가 잘 안보인다.
- #if 0 를 쓰면 간단하게 가능하다.
- 하지만 #if 0 보다 그 이유를 명확히 알 수 있도록 코드를 정해 놓고
7.4 no data def in header files
- 헤더 파일에 변수를 선언하지 말 것.
- 변수 안쓰는 파일에도 변수가 들어가서 자리 차지함.
- 꼭 써야겠다면 헤더에는 extern 붙여서 선언, c 파일에 값을 넣을 것.
8 miscellaneous 3
8.1 mixing c and c++ (!)
- c++ 에서 c 함수를 부를 때는 (extern "C"는 cpp 컴파일러에만 있다.)
- c / c++ 둘 다 컴파일 옵션일 때는 c 컴파일러에서는 extern "C"를 알 수 없기 때문에
- extern "C" 선언은 하나 하나 하지말고 모아서
}
int cdf () {
} }
- header 에 extern "C" 로 선언된 함수에 대한 .c 파일이 있고, 이 파일에서 해당 헤더파일을 포함해야.
- extern "C" 아래에는 헤더파일을 include 하지 말 것
- @see: http://spikez.tistory.com/19
8.2 no magic numbers
- 특정 값은 모두 그냥 숫자 그대로 쓰지 말고 #define 이나 constant 를 사용할 것.
- 그냥 막 magic numbers 적어버리면 무슨 의미를 갖는지 모른다…
8.3 error check policy
- 모든 시스템 콜은 주어진 에러 코드로 에러 체크를 해야한다.
- 특히 malloc 같은 것. wrapper를 쓰는 것도 좋은 옵션
8.4 static, extern
- static c 파일 하나 내부에서만 사용 가능. header 파일에 선언 불가능.
- extern시 전역 범위에 선언