본문 바로가기

개발 관련

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

이전에 워드에 올린 문서를 블로깅 한다.

혹 저작권에 걸리면 내릴게요..


NHN C 코딩 규칙.docx



NHN C/C++ 코딩 규칙


1. buffer-overflow에 위험한 함수를 사용하지 않는다.

: windows에서 buffer overflow에 위험한 함수 리스트

strcat

wcscat

lstrcat

strcat

StrCatBuff

_tcscat

_ftcscat

strncat

StrNCat

strcpy

wcscpy

lstrcpy

strcpy

_tcscpy

_ftcscpy

Strncpy

gets

_getws

_getts

Sprint

swprintf

wsprintf

wnsprintf

_stprintf

_snprintf

_snwprintf

_sntprintf

vsprintf

vswprintf

Wvsprintf

wvnsprintf

_vstprintf

_vsnprintf

_vsnwprintf

_vsntprintf

Strlen

 

 

 

 

 

2. 파일이름은 언더바(_)로 시작하지 않는다.

_a.c   <- Error

_bsds.h <- Error

 

아래와 같이 사용한다.

a.c

BdSc.h

 

3. 같은 파일명은 한번 이상 사용하지 않는다.

/testdir/test1.c

/testdir1/test1.c  <- 위반. 파일명 ‘test1’은 두번 사용된다.

 

아래와 같이 사용한다.

testdir/test.c

testdir1/test1.c

 

4. 파일명에 특별한 문자를 사용하지 않는다.

파일이름은 알파벳, 숫자, 언더바(_)만 사용한다.

 

/testdir/test-1.c   <- 위반. – 이 사용됨

/testdir1/test!1.c  <- 위반. !가 사용됨.

아래와 같이 사용한다.

testdir/test.c

testdir1/test_1.c

 

5. cpp 파일 이름은 대표 class 이름으로 사용한다.

파일이름은 대표적인 class/struce 이름을 포함한다. 파일이 class/struct 모두 있다면, 클래스 중의 하나로 이름을 짓는다.

만약 클래스이름이 ‘C’로 시작하면, ‘C’는 파일이름에서 생략할 수 있다.

a.h  <- 위반. 클래스 이름 ‘TestClass’을 포함해야 한다.

class TestClass()

{ }

 

a.cpp <- 위반. 클래스 이름 ‘Test’를 포함해야 한다.

void Test::Method1()

{ }

아래와 같이 사용한다.

TestClass.h <- OK

Class TestClass

{ }

 

Class1.h <- OK

Class CClass1

{ }

 

TestClass.cpp <- OK

Void TestClass::Method1()

{ }

 

6. cpp 파일 이름은 언더바(_)를 사용하지 않는다.

cpp 파일이름은 알파벳과 숫자만을 사용한다.

/testdir/test_1.cpp   <- 위반. _이 사용됨

/testdir1/_test.cpp   <- 위반. _이 사용됨.

 

아래와 같이 사용한다.

Testdir/test.cpp

testdir1/test_1.c    <- c 파일은 상관 없다

 

7. c 파일이름은 대문자를 사용하지 않는다.

c 파일은 대문자를 사용하지 않는다. 이 규칙은 ‘c’ 파일만 해당된다.

/testdir/test_A1.c      <- 위반. 대문자 A가 사용됨

/testdir1/_TestBeta.c   <- 위반. 대문자 T B가 사용됨

 

아래와 같이 사용한다.

testdir/Test.cpp    <- cpp 파일은 상관 없다

testdir1/test1.c    <- OK

 

8. bool값을 리턴하는 경우 함수 이름은 is혹은 has로 시작한다.

bool checkSth() {        <- 위반. 함수 이름은 isSth hasSth이어야 한다.

        return false;

}

 

아래와 같이 사용한다.

bool isSth() {       <- OK.

    return true;

}

 

is isSth() {         <- bool을 리턴하지 않기 때문에 상관 없다.

}

 

9. windows에서는 함수 이름을 대문자로 시작한다.

Window C/C++ 코드에만 이 규칙이 적용되며, 유닉스에서는 소문자로 함수 이름을 시작한다.

bool checkSth()     <- 위반. 함수 이름이 소문자 ‘c’로 시작한다.

{

    return false;

}

 

bool _checkSth()    <- 위반. 함수 이름이 소문자 ‘c’로 시작한다.

{

    return false;

}

 

아래와 같이 사용한다.

bool IsSth()        <- OK.

{

    return true;

}

 

bool _IsSth()      <- OK.

{

}

 

10. private 함수 이름은 언더바(_)로 시작한다.

이 규칙은 cpp파일에만 적용된다.

class A

{

private:

    bool GetSth();  <- 위반.private 함수는 _로 시작한다.

};

 

아래와 같이 사용한다.

class A

{

public :

    bool GetSth();    <- public 함수는 상관 없다.

private:

    bool _GetSth();   <- OK.

};

 

11. 들여쓰기는 tab을 사용한다.

void Hello()

{

[SPACE][SPACE]Hello(); <- 위반. 들여쓰기에 스페이스가 사용되었다.

}

 

아래와 같이 사용한다.

void Hello()

{

[TAB]              <- 빈 라인이기 때문에 상관 없다.

[TAB]Hello();     <- Good

}

 

12. 들여쓰기는 space를 사용한다.

void Hello()

{

[TAB]            <- 빈 라인이기 때문에 상관 없다.

[TAB]Hello();   <- 위반. 들여쓰기에 tab이 사용되었다.

}

 

 

아래와 같이 사용한다.

void Hello()

{

[TAB]                    <- 상관 없다.

[SPACE][SPACE]Hello(); <- Good.

}

 

13. enum 블록내의 아이템은 들여쓰기 한다.

enum A {

    A_A,     <== Good

    A_B

}

 

14. eunm 아이템은 분리된 라인에 작성한다.

enum A {

    A_A, A_B <== Violation

}

 

아래와 같이 사용한다.

enum A {

    A_A,     <- Good

    A_B

}

 

15. 함수의 긴 파라미터 리스트는 정렬한다.

void functionA(int a, int b

               int c);                          <- 위반

 

void functionB(int a, int c,

                     int d)                     <- 위반

 

아래와 같이 사용한다.

void functionA(int a, int b

                int c);                         <- OK


16. 조건문은 정렬한다.

if (a == b &&

  a == c)      <- 위반

 

아래와 같이 사용한다.

if (a == b &&

    a == c)   <- OK

 

17. operator 주위에 공백을 둔다.

이항 연산자 앞과 뒤에 공백을 제공한다.

단항 연산자 앞과 뒤에 공백을 제공하나, (A++), [--BB], {--KK}와 같이 사용할 때는 공백이 없어도 좋다.

일부 연산자(“ , “, “ ; “)는 연산자 뒤에 공백을 제공해야 한다.

for (a;b;c)    <- 위반. (a; b; c)로 변경

Hello(a,b,c)   <- 위반. (a, b, c) 로 변경

int k = 2+3;   <- 위반. 2 + 3 로 변경

c+++c;          <- 위반. c++ + c 로 변경

 

아래와 같이 사용한다.

int k = (2 + 3);    <- OK. ’(‘ 앞과 뒤에 공백이 없다.

int k = -2;         <- OK. minus minus값을 의미하기 때문에 이 규칙과 상관 없다.

for (a; b; c) {}    <- OK

Hello(a, b, c);     <- OK 

tt[c++]              <- OK.


18. word 주위에 공백을 둔다.

함수 범위 내에서 if, else, for 단어의 앞과 뒤에 공백을 둔다.

switch while은 바로 다음에 “(“를 사용한다.

void function()

{

    for(k;j;c) {      <== Violation. 'for (k;j;c)' 로 변경

    }

    if(k) {           <== Violation. 'if (k)' 로 변경

    }else {           <== Violation. '} else' 로 변경

    }

}

 

아래와 같이 사용한다.

#define KK for(a;b;c)   <== 함수 범위 내가 아니기 때문에 상관 없다.

 

void function() {

    for (k;j;c) {       <== OK

    }

    if (k) {            <== OK

    } else {            <== OK

    }

}

 

19. 한 라인에 120자를 넘지 않는다.

int HEEEEEEEEEEEEEEEEEEELLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO = 1;

<== 위반. 너무 길다.

 

아래와 같이 사용한다.

int K;      <== OK. 짧다.

 

20. namespace brace( { )는 분리된 라인에 작성한다.

namespace AA {           <== ERROR

}

 

아래와 같이 사용한다.

namespace 

{

}

 

21. 함수 정의의 brace( { )는 분리된 라인에 작성한다.

 

void A() {                <== 위반

 

}

 

void A()

{

}                         <== 위반. 다른 컬럼에 있다.

 

 

아래와 같이 사용한다.

void A()

{                        <== OK

} 

void K()

{

    while(True) {       <== 상관 없다.

    }

}

 

22. 타입 정의의 brace( { )는 분리된 라인에 작성한다.

class K() {            <== ERROR

}

 

struct K {             <== ERROR

}

 

아래와 같이 사용한다.

struct A()

{                       <== OK

}

class K()

{ <== CORRECT

public :

    void Hello() {    <== 함수 정의은 상관 없다.

    }

}

 

23. 함수 내부의 brace( { )는 라인 끝에 위치시킨다.

void A() {            <== 상관 없다.

for (;;)

{                  <== ERROR

}

}

class K()

{                      <== 상관 없다.

if (true)

{                  <== Error

}

}

 

아래와 같이 사용한다.

void A() {            <== 상관 없다.

for (;;) {            <== OK

}

}

class K()

{                      <== 상관 없다.

if (true) {           <== OK

}

}

 

24. 함수 내부에서의 들여쓰기 블록

void A() {

    for (;;)               <== 위반

        {

        }

}

  

void K()

{                          <== 함수 내부가 아니기 때문에 상관 없다.

    if (true)

    {

        if (KK) {

        AA;                <== 위반

        }

    }

       

    switch(TT) {

    case WEWE:            <== 위반

        WOW;

    }

}

 

아래와 같이 사용한다.

void K()

{

    if (true)

    {

        if (KK) {         <== OK

            AA;            <== OK

        }

    }

 

    switch(TT) {         <== OK

        case WEWE:       <== OK

            WOW;

    }

}