티스토리 뷰

Programming tips/language

c coding convetion

bramach 2018. 3. 31. 22:38
c coding convention

c coding convention

Table of Contents

1 Name

  • 이름을 보고 무엇을 하는 변수/함수인지 알 수 있게 한다.

1.1 functon name

  • 명사만 적지 말고 동사를 포함한 이름으로 동작을 알 수 있게 한다.
  • max, cnt, key 와 같은 접미사, is, get, set 같은 접두사를 잘 쓰자.

1.2 unit name

  • 수치를 나타내는 변수에는 그 단위를 함께 적어준다.

1.3 structure name

  • 변수 선언 시 타입을 섞어서 선언하지 말고, 같은 타입끼리 연속되게 한다.
  • 스트럭쳐는 소스파일의 최상위나 헤더 파일 최상위에 적는다.
  • 헤더파일에 적는 경우에는 extern을 사용하도록 하자.
  • bit field 를 사용하는 경우에는 같은 라인으로 맞춰서 쓰자.
예시를 들면 unsigned int bnz:1 fnz:5 zap:2

1.4 variable names on the stack

  • lowercase + _

1.5 poineter name

  • 포인터 선언시 *은 변수 앞에 딱 붙여서 사용한다.
예시를 들면 char *ptr, nonptr;

1.6 global variables

  • g_name -> g_ 로 시작

1.7 global constants

  • upper case + _
  • macro 와 헷갈리지 않도록 이름에 global임을 표시
예시를 들면 const int G_CONSTANTS = 5;

1.8 macro name

  • 모두 대문자 + _
  • 우측에 오는 변수들은 모두 괄호로 싸야 하고, 이 괄호 앞 뒤로는 space 적어준다.
  • 두 줄 이상의 macro function 은 do {} while (0)으로 감싼다. 이어지는 줄 끝에는 \
#define MACRO(v, w, x, y) \ do { \ v = (x) + (y) \ w = (y) + 2 \ } while (0)

1.9 enum names

  • upper case + _
  • no comma for last element
enum PinStateType { PIN_OFF, PIN_ON };
  • enum을 이용해서 에러 코드를 만들자.
enum { STATE_ERR, STATE_OPEN, STATE_RUNNING, STATE_DYING};

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 끝에 적는다.
} * comments *

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 으로 싸자.
switch () { case 1: ….
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 달기, 초기화하기 좋다.
char **a, *x; <- 이렇게 쓰지말고 한 줄에 하나. -> char *a; / comment*/ char x; / comment*/

4.2 enum 대신 #define 이나 constant 를 사용하자. (!)

  • 기본적으로 constant variable을 사용하면 메모리를 많이 차지하기 때문에 deprecated.
  • constant variable에 대한 처리는 기본적으로 다르긴 하지만 .. 기본은 공간을 차지함.
  • 그리고 enum 은 타입이 없음. int 라는 보장도 없음..
  • 그러므로 type이 필요한 경우에는 #define 이나 const 를 사용하자.
enum {var = 5};
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에 함수를 쌓아놓고, 함수를 부르는 속도를 빠르게 한다.
성능 차이는 거의 없다. 가독성이나 안정성은 inline이 훨씬 좋다.
  • 매크로는 문자 그대로를 치환하는 것이므로 사용 시 매우 주의해야함.
MAX (x++, y) 를 부르면 (((x++) > (y) ? (x++) : (y)) 로 치환되어 버림..ㅋㅋ

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

  • 해당 파일을 왜 포함 시켰는지 적어줘야 함. 커맨트 순서는
kernel include non local network include (?) /usr

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 보다 그 이유를 명확히 알 수 있도록 코드를 정해 놓고
#if NOT_YET_IMPLEMENTED #if OBSOLETE #if TEMP_DISABLED 처럼 쓰고, 왜 커맨트 처리 되었는지도 적어 주면 좋다.

7.4 no data def in header files

  • 헤더 파일에 변수를 선언하지 말 것.
  • 변수 안쓰는 파일에도 변수가 들어가서 자리 차지함.
  • 꼭 써야겠다면 헤더에는 extern 붙여서 선언, c 파일에 값을 넣을 것.

8 miscellaneous 3

8.1 mixing c and c++ (!)

  • c++ 에서 c 함수를 부를 때는 (extern "C"는 cpp 컴파일러에만 있다.)
extern "C" some_functions(); 처럼 extern "C"를 매번 붙여준다.
  • c / c++ 둘 다 컴파일 옵션일 때는 c 컴파일러에서는 extern "C"를 알 수 없기 때문에
extern "C" some_function(); #else extern some_function(); #endif
  • extern "C" 선언은 하나 하나 하지말고 모아서
extern "C"{ int abc () {
}
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시 전역 범위에 선언
Author: dahyun
Created: 2016-06-12 일 15:25
Emacs 24.5.1 (Org mode 8.2.10)

'Programming tips > language' 카테고리의 다른 글

자바 성능 튜닝 이야기 요약 (ch1 - 8)  (0) 2018.03.31
shell programming tutorial  (0) 2018.03.31
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함