25. 함수 내부에서 닫는 brace( } )는 같은 컬럼에 위치시킨다.
void A() { //<== 상관 없다. for (;;) { <== ERROR } } class K() { //<== 상관 없다. if (true) { //<== Error } } |
아래와 같이 사용한다.
void A() { //<== 상관 없다. for (;;) { //<== OK } } |
26. 한 문장이라도 brace를 사용한다.
void Function() { for (;;) print("WOW"); //<== 위반
while(i > 7) i++; //<== 위반 } |
아래와 같이 사용한다.
void Function() { for (;;) { print("WOW"); //<== OK } while(i > 7) { //<== OK i++; } } |
27. class 정의에 doxygen 주석을 제공한다.
각 클래스 정의 앞에 doxygen 스타일의 주석을 사용한다.
class A { //<== 위반. No doxygen comment. };
/* //<== 위반. doxygen 주석이 아니다. * */ class B { };
|
아래와 같이 사용한다.
/** * blar blar */ class A { //<== OK };
class B; //<== 전방 선언은 상관 없다. |
28. namespace 정의에 doxygen 주석을 제공한다.
각 namespace 키워드 앞에 doxygen 스타일 주석을 사용한다.
namespace AA //<== 위반. namespace AA에 대한 주석이 없다. { }
/* //<== 위반. 주석이 있지만, doxygen 주석이 아니다. * blar blar */ namespace BB { } |
아래와 같이 사용한다.
/** <== OK! * blar blar */ namespace AA { } |
29. struct 정의에 doxygen 주석을 제공한다.
각 struct/union 정의 앞에 doxygen 스타일 주석을 사용한다.
struct A { //<== 위반. 주석이 없다. };
/* //<== 위반. doxygen 주석이 아니다 * */ union B { }; |
아래와 같이 사용한다.
/** * blar blar */ struct A { //<== OK };
struct A; //<== 전방 선언은 상관 없다. |
30. 헤더파일의 함수에 doxygen 주석을 제공한다.
헤더파일의 각 함수 앞에 doxygen 주석을 사용한다.
private 이 아닌 함수만 작성해도 좋다.
= a.h = void FunctionA(); //<== 위반. 주석이 없다.
/* //<== 위반. doxygen 주석이 아니다 * */ void FunctionB(); |
아래와 같이 사용한다.
= a.h = /** * blar blar */ void FunctionA(); //<== OK
/** * blar */ void FunctionB() { //<== OK. }
class A { private : void FunctionC(); //<== private 함수이기 때문에 상관 없다. } = a.c = void FunctionD(); //<== c 파일에 정의되었기 때문에 상관 없다. |
31. 구현부(cpp)에서 함수에 doxygen 주석을 제공한다.
static/private 함수가 아닌 함수들에 대해 doxygen 주석을 작성한다.
cpp파일에 함수 정의부가 구현되어 있으면, private 함수인 경우 오른쪽에 ‘// NS’라고 적는다.
예 )
= a.cpp = void KK::C() // NS { } |
a.cpp = void FunctionA() { //<== 위반. 주석이 없다. }
/* //<== 위반. doxygen 주석이 아니다. * */ void FunctionB() { } |
아래와 같이 사용한다.
= a.cpp =
/** //<== OK * blar blar */ void FunctionA() { }
/** * blar blar */ void FunctionB(); //<== OK.
class A { private : void FunctionC() { //<== private 함수이기 때문에 상관 없다. } } static void FunctionD() //<== c style private 함수이기 때문에 상관 없다. { } = a.h = void FunctionB(); //<== 헤더에 선언되었기 때문에 상관 없다. |
32. 함수 파라미터 이름은 생략하지 않는다.
함수 선언시 파라미터 이름은 생략하지 않는다. 함수 선언부만 체크한다.
void functionA(int a, int); //<== 위반. 두번째 파라미터 int의 이름이 없다.
void functionB(int ); //<== 위반. 첫번째 파라미터 이름이 없다. |
아래와 같이 사용한다.
void functionA(int a, int b, int c, int d, int e); //<== Good.
void functionB(int, int, int c, int d) //<== 함수 정의부는 상관 없다. { } |
33. 함수에 파라미터 5개 이상은 사용하지 않는다.
각 함수에 5개 이상의 파라미터를 사용하지 않는 대신, 구조체를 사용한다.
void functionA(int a, int b, int c, int d, int e, int j); //<== 위반, 5개 이상
void functionB(int a, int b, int c, int d, int e, int j, int k) //<== 위반 { } |
아래와 같이 사용한다.
void functionA(int a, int b, int c, int d, int e); //<== Good. 5 parameters.
void functionB(int a, int b, int c, int d) //<== Good. 4 parameters { } |
34. 함수는 200라인을 넘지 않는다.
함수는 공백은 포함하지 않고 200라인 이상 작성하지 않는다.
35. system 의존적인 타입을 사용하지 않는다.
int k; short b; long t; |
아래와 같이 사용한다.
int32_t b; //<== Good |
36. enum의 첫번 째 아이템은 초기화 한다.
enum A { A, B //<== 위반 } |
아래와 같이 사용한다.
enum A { A=4, B //<== OK } |
37. 매크로 상수는 대문자로 작성한다.
#define Kk 1 //<== 위반. 소문자 'k'가 사용되었다. #define tT "sds" //<== 위반. 소문자 't'가 사용되었다. |
아래와 같이 사용한다.
#define KK 3 //<== OK. KK는 대문자이다. #define kk(A) (A)*3 //<== 매크로 함수는 상관 없다. |
38. 상수 선언은 매크로를 사용하지 않는다.
대신, enum이나 const 변수를 사용한다.
그러나, 매크로 함수는 사용해도 좋다. 매크로가 언더바(_)로 시작한다면, 특별한 목적을 위해 정의되었다고 간주한다.
#define KK 1 //<== 위반 #define TT "sds" //<== 위반 |
아래와 같이 사용한다.
#define KK(A) (A)*3 //<== macro 함수는 상관 없다. const int k = 3; //<== OK const char *t = "EWEE"; //<== OK |
39. double 대입은 사용하지 않는다.
k = t = 1; //<== 위반. double assignments are used. void a() { b = c = 2; //<== 위반. double assignments are used. } |
아래와 같이 사용한다.
k = 1; //<== OK t = 1; void a() { b = 2; c = 2; } |
40. 물음표 키워드(?)는 사용하지 않는다.
void a() { c = t ? 1 : 2; //<== 위반. ? 키워드 사용되었다. } |
아래와 같이 사용한다.
void a() { if (t) { //<== OK. c = 1; } else { c = 2; } } |
41. goto 문을 사용하지 않는다.
void FunctionA() { while(True) { goto AAA; //<== 위반. goto문이 사용되었다. } AAA: }
|
아래와 같이 사용한다.
void FunctionA() { while(True) { break; //<== OK. } } |
42. 파일 정보에대한 주석을 제공한다.
copyright를 포함한 파일 주석을 파일의 상단에 작성한다.
= start of file = #define "AA" //<== 위반. 파일 처음은 파일 주석으로 시작해야 한다. /// /// blar blar /// Copyright reserved. ///
= start of file = /** //<== 위반. copyright 문구가 없다. * blar blar * blar blar */ |
아래와 같이 사용한다.
= start of file = /// /// blar blar /// Copyright reserved. <== OK ///
= start of file = /** * blar blar * Copyright reserved. <== OK * blar blar */ |
43. include 경로를 하드코딩하지 않는다.
#include "c:\Hello.h" //<== 위반. Window style 절대 경로 #include "/usr/include/Hello.h" //<== 위반. Linux style 절대 경로 |
아래와 같이 사용한다.
#include "Hello.h" #include "include/Hello.h" |
44. use reentrant function
Use reentrant functions. Do not use not reentrant functions.(ctime, strtok, toupper)
void A() { k = ctime(); //<== Violation. ctime() is not the reenterant function. j = strok(blar blar); //<== Violation. strok() is not the reenterant function. } |
아래와 같이 사용한다.
void A() { k = t.ctime(); //<== Correct. It may be the reentrant function. }
void A() { k = ctime; //<== Correct. It may be the reentrant function. } |
45. 너무 깊은 블록은 피한다.
함수 내에서 block 깊이가 4 이상이 되지 않게 한다.
void f() { {{{{{ //<== 위반. 너무 깊다. 4 block 이상이다.
}}}}} } |
아래와 같이 사용한다.
void f() { {{{{ //<== OK!
}}}} } |
<참조>
1. http://dev.naver.com/projects/nsiqcppstyle
2. http://nsiqcppstyle.appspot.com/rule_doc/