[C/C++] My Coding Convention

Coding Convention
* Linux Kernel의 Coding Convention을 따른다.
http://www.kernel.org/doc/Documentation/CodingStyle

Naming Convention!
코딩 Style
* 주석 등을 사용할때, 연속되는 문장이 80자가 넘어가면 line을 바꾸고, 문단의 indentation + 2만큼 들여쓴다.
ex)

/*
 * start of comment line .......................... (80자 에 도달함.)
 *   continue....
 *   continue....
 */

* statement 안에 포함된 string의 경우는 80 자가 넘어가는 것을 허용하나, 경우에 따라서 아래와 같은 style을 사용하도록 한다.

- 80자가 넘어가도록 하는 경우.
                myprintf(arg0, arg1,
                         "..............................<80자 넘음>............................\n",
                         arg2, arg3);

- print라인을 바꾸는 경우 (선호)
                myprintf(arg0, arg1,
"...........................<긴 string>.............\n"
                         arg2, arg3);

- multiple 라인의 경우
                myprintf(arg0, arg1,
"haha... this is very long print...\n"
"Additionally, it's multiple line...\n"
                         arg2, arg3);

* statement 에서 80자가 넘어가면 다음과 같은 형식을 따른다.

- assign statement의 경우.
        < '=' 이후 라인을 바꾼다! - '='을 아랫쪽 라인에 적지 않도록 한다! >
        const struct my_long_long_struct_name* my_long_var_name =
                malloc(sizeof(*my_long_var_name));

- 긴 이름 (indentation보다 긴 이름)의 함수 calling
        call_long_name_function(
                parameter1,
                parameter2,
                ...);

- 짧은 이름 (indentation보다 짧은 이름)의 함수 calling
        call_short_name_function(parameter1,
                                 parameter2,
                                 ...);

큰 원칙.
* Function의 이름에는 Abbriviation을 사용하지 않는다.
* 변수의 이름은 경우에 따라 Abbrivation을 허용한다. (사용되는 scope가 작을 때, temporary한 변수일 때 등등)
– Global 변수 : ‘g_’로 시작한다.
– 모든 변수, 함수 이름에 사용되는 알파벳은 소문자 + ‘_’의 사용을 원칙으로 한다. 단 필요에 따라 대문자도 사용가능 하다. (ex. abbriviation)
ex) len, string, my_LUT (LUT := look up table)
– 모든  상수의 이름은 대문자 + ‘_’의 사용을 원칙으로 한다.
– “사용되는 모양”이 function like한 macro의 경우는 ‘function naming convention’을 따른다. Otherwise 대문자가 주가 되는 방식을 사용한다.(function경우와 반대)
ex) #define offsetof .. / #define uNROLL16(…)
– type name : 소문자 사용을 원칙으로 한다. 반드시 ‘_t’로 끝난다. (c defacto standard)
ex) typedef unsigned int size_t
– Member variable : 일반적인 변수 선언과 같다. 단 시작은 반드시 ‘_’로 한다.
– Protected & Private Member function : Public member function 의 rule을 따르고, 시작은 반드시 ‘_’로 한다.
ex) _get_num_of_unit(…)
– Private / Protected class type, structure type은 위에서 정의된 “type name”의 Rule을 따르되 반드시 ‘_’으로 시작한다.
– Static member function : 각 rule을 따르고, 시작은 반드시 ‘static_’로 한다.
ex) static_get_num_of_unit(…) : public static member
static__get_num_of_unit(…) : private / protected static member
– Static function : member가 아닌 static function은 function의 rule을 따르고, 시작은 반드시 ‘_’로 한다.
ex) _get_num_of_unit(…), _get_crc_LUT(…)
Coding Convention
+ function안에서 바뀌는 [in/out] [out] type의 parameter는 pointer를 사용한다. funciion 안에서 바뀌지 않는 [in] type의 paramter는 reference를 사용한다. (reference의 사용이 곤란하다면, const pointer를 사용한다.) (refer “reference와 pointer’)
+ Pointer에 할당된 값으로 무언가를 할때, 그 function으로 인해 pointer가 가리키는 값이 의미가 없어지는 경우에만 해당 함수안에서 pointer의 값을 NULL로 바꾸도록 한다.
ex. void Kill_Timer (HTimer* timer) { _kill(*timer); *timer=NULL; }
(위에서 HTImer는 (void*)이다. )
Kill된 timer handle은 사용할 수가 없다.
하지만, 함수가 끝나고도 pointer가 가리키는 값이 의미를 가질때는 위와 같이 하지 않는다. (함수 뒤쪽에서 해당값을 계속 사용하는 경우가 많다.)
ex. void Append_timer( HTimemr timer) { List.Append(timer) }
이 경우, timer handle이 List에 append되어서 pass된 상태(List내에서 memory를 delete한다고 가정)이므로, timer가 가리키는 메모리를 외부에서 delete하면 안된다 – 위와 같이 timer handle를 NULL로 바꾸는 것이 좋아보이기도 한다.-. 하지만, 이 경우 timer가 가리키는 값을 함수 뒤쪽에서 계속해서 쓰는 경우가 많으므로, NULL로 값을 바구지 않는다. 만약 바꾸게 되면, 안정성은 훨씬 좋아지나, 불편함이 많이 늘어나서, standard를 지키게 되지 않는 경우가 생길 수 있다.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s