본문 바로가기

개발 관련

NHN C/C++ 코딩 규칙 (2/2)



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 aint); //<== 위반두번째 파라미터 int의 이름이 없다.

 

void functionB(int );       //<== 위반첫번째 파라미터 이름이 없다.

 

아래와 같이 사용한다.

void functionA(int aint bint cint dint e); //<== Good.

 

void functionB(intintint cint d)              //<== 함수 정의부는 상관 없다.

{

}

 

 

33. 함수에 파라미터 5개 이상은 사용하지 않는다.

각 함수에 5개 이상의 파라미터를 사용하지 않는 대신구조체를 사용한다.

 

void functionA(int aint bint cint dint eint j); //<== 위반5개 이상

 

void functionB(int aint bint cint dint eint jint k)  //<== 위반

{

}

 

아래와 같이 사용한다.

void functionA(int aint bint cint dint e); //<== Good. 5 parameters.

 

void functionB(int aint bint cint d)          //<== Good. 4 parameters

{

}

 

 

34. 함수는 200라인을 넘지 않는다.

함수는 공백은 포함하지 않고 200라인 이상 작성하지 않는다.

 

              

35. system 의존적인 타입을 사용하지 않는다.

int k;

short b;

long t;

 

아래와 같이 사용한다.

int32_t b;       //<== Good

 

 

36. enum의 첫번 째 아이템은 초기화 한다.

enum A {

    AB        //<== 위반

}

 

아래와 같이 사용한다.

enum A {

    A=4B     //<== 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/