[C++] Coding Guidelines

Gyuwon Choi
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;}

--

--