이전에 워드에 올린 문서를 블로깅 한다.
혹 저작권에 걸리면 내릴게요..
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’는 파일이름에서 생략할 수 있다.
|
아래와 같이 사용한다.
|
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; } } |