[C++] Coding Guidelines
4 min readNov 3, 2020
길이 맞추기
- 적당한 길이에서 행을 바꿔준다.
- 각 조건이나 호출된는 함수, 또는 변수에 알맞게 행을 바꿔준다.
- logical 하게 grouping 해주는 것이 좋다.
<잘못된 예시>
if ( ( dir == 10 && out_form == 1) || ( dir == 10 && out_form == 2 ) || ( dir == 30 && out_form == 1)) {...}
<적절한 예시>
if ( ( dir == 10 && out_form == 1)
|| ( dir == 10 && out_form == 2)
|| ( dir == 30 && out_form == 1)) {...}
함수 및 변수 선언 기법
- 대표적인 방법으로는 크게 두 가지가 있다.
- `CamelCase` 와 `snake_case` 이다.
- 이러한 기법을 바탕으로 다음과 같이 작성한다.
함수 및 변수 선언 방식
- 함수와 변수는 lower case로 시작한다 : `obuParam`
- 타입은 대문자로 시작한다: `ObuDriver`
- 상수는 모두 대문자로 작성한다 : 'const int HEIGHT = 1920'
Private Object Data 선언
- prefix 를 활용하여 public obj data와 구별할 수 있도록 한다.
< 예시>
namespace ObuDriver {ObuDriver::ObuInterface() : nh("~"){ //생성자 std::string m_obuIP;
std::string m_obuPort;
unit8 m_lamp;
unit8 m_dir;
... }}
Function parameter 구별
- prefix를 활용하여 함수에 전달되는 인자와 함수 내 변수를 구별할 수 있도록 함.
<예시>
void CallbackFromObuData (const obu_msgs::ObuDataConstPtr& t_msg ){ uint8 lamp;
uint8 dir; lamp = t_msg.lamp;
dir = t_msg.dir; ...}
C++ 파일 확장자
- C++파일은 `.cpp` 또는`.cc` 로 한다. `.c`로 하지 않는다.
- C++ 헤더파일은 `.hpp`로 한다. `.h`로 하지 않는다.
`nullptr`의 사용
- 0 또는 NULL 을 대신하기 위하여 `nullptr’을 활용 할 수 있다.
메모리 접근 방식
- 포인터를 선언하여 메모리 할당 및 접근을 하는 기존의 C언어 방식을 지양한다.
- C++ 의 특성을 살려서 메모리를 접근할 수 있도록 한다.
<나쁜 예시>
ObuClass *m_obuDriver = new ObuClass;...delete obuDriver;
- 위와 같은 예시는 만약 사용자가 delete 시점을 적절하게 잡아주지 못한다면 메모리 문제를 야기할 수 있다.
<좋은 예시>
std::shared_ptr<obuClass> obuDriver = make_shared<obuClass>();
- 반면, 위와 같이 obuDriver는 미사용 시 자동으로 메모리가 해제되게 되어 코드의 안정성이 높아진다.
전위 연산자 >후위 연산자
- 전위 연산자를 권장한다.
- 후위 연산자의 경우, 값이 리턴 된 후에 +1 이 된다. 즉, 기존 값에 대한 copy가 이뤄지므로 전위 연산에 비해 느리다.
- 전위 연산자의 경우, 값이 +1 이 된 후에 리턴되어 후위 연산에 비해 빠르다.
<나쁜 예시>
for (int i = 0; i < PACKET_SIZE; i++){
... memcpy(oldBuf[i], parseBuf[i], PACKET_SIZE*sizeof(uint8));
parsPacket(parseBuf[i]); ...}
<좋은 예시>
for (int i = 0; i < PACKET_SIZE; ++i){
... memcpy(oldBuf[i], parseBuf[i], PACKET_SIZE*sizeof(uint8));
parsPacket(parseBuf[i]);...}
Const 의 활용
- `const`를 활용하여 컴파일러에게 해당 변수의 값이 immutable 한 것임을 알려줄 수 있다.
- 참조자를 활용하여 `const &` 로 쓸 수 있다. 추가적인 메모리 카피를 방지.
<나쁜 예시>
class ObuClass{ public: ObuClass(std::string t_portNum) : m_port(t_portNum) { } std::string get_port() { return m_port; } private: std::string m_port;}
<좋은 예시>
class ObuClass{ public: ObuClass(const std::string &t_portNum) : m_port(t_portNum) { } std::string get_port() const // 해당 함수 내에서 어떤 변수도 바꿀 수 없음 { return m_port; } private: std::string m_port;}