1 minute read

사실 style guide가 나와서 말인데, 나는 조엘이 엄선한 소프트웨어 블로그 베스트 29선에서 본 ’스타일은 언어 요소다 - 켄 아놀드’글을 완전 지지한다. 많은 언어가 무시하는 공백 문자를 언어 요소로 넣자고 주장하는데, 지겨운 스타일 논쟁을 완전 없앨 수 있고 파싱이 쉬워 IDE에서 지원할 껀덕지도 무척 많아지기 때문이다. 어딜 가나 같은 스타일… 적응할 필요도 없으니 얼마나 좋은가.

하지만, 현실로 돌아오자. 현재 게임 클라이언트를 구현하는데 C++을 버리는 게 불가능하다. 그래서 이렇게 여러 스타일이 존재하는 언어에서는 좋은 스타일을 보고 배우고 자신의 스타일을 잡아가는 게 중요하다. 좋은 코딩 스타일은 가독성을 높여주고 코딩 실수를 줄여준다. 스타일을 지키는 것도 습관이다. 물론 가장 중요한 건 정한 스타일을 잘 지키는 것이다.

나중에 시간 나면 살펴보겠다고 북마크해둔 Google C++ Style Guide를 살펴보고 괜찮겠다 싶은 것들을 요약해봤다. 후후 역시 좋다고 북마크하긴 쉬워도 시간 내서 한번 살펴보기는 어렵네.

void someFunction(
    const std::string& input1,
    const std::string& input2,
    std::string* output)
{
    ...
}
  • 파라미터 순서는 input, output 순서이다.
  • input은 const 참조, output은 포인터를 사용한다.
// foo.cpp

#include "pch.h"
#include "foo.h"

// C system files.
#include <stdio.h>

// C++ system files.
#include <iostream>

// Other libraries' .h files.
#include <lib/lib.h>

// Your project's .h files.
#include "myproject/bar.h"
  • 크. include 순서도 엄격히 정해서 지키는구나. 동일 그룹은 알파벳 순서로 소팅한다.
  • cpp 파일의 선언이 있는 헤더 파일을 pch를 제외하고 가장 먼저 인클루드하는데 이렇게 하면 숨어 있는 종속성을 없앨 수 있기 때문이다.
void SomFunction(
        int input,
        bool defaultParameter = false) // X
{...}
  • 디폴트 파라미터(default parameter)는 사용 금지.
  • 기능 추가할 때, 아주 빠지기 쉬운 악마의 유혹.
#include <stdint.h>

int16_t s16;
uint32_t u32;
int64_t s64;
  • 표준에 명확한 타입 사이즈가 명시되어 있지 않다.
  • 시리얼라이즈, 디시리얼라이즈처럼 명확한 타입 사이즈가 필요한 경우가 있다
  • 64비트 포팅 - 32비트 포인터들이여 안녕”에 쓴 것처럼 찾아보면 다 있다. 이럴 때 사용하라고 stdint.h에 정의해놨다.
Struct data;
memset(&data, 0, sizeof(data));   // O

memset(&data, 0, sizeof(Struct)); // X
  • sizeof(varname)를 사용한다.
  • sizeof(type)을 사용한다면 변수 타입이 바뀌었으면 찾기 어려운 버그를 만들 수 있다.

그리고 마지막으로 참 구글스럽고 멋진 스크립트. 저렇게 텍스트로만 스타일 가이드를 한 게 아니라 스타일 에러를 잡을수 있는 cpplint를 만들어 놓았다. 말로만 텍스트로만 끝나는 게 아니라 적절히 컴퓨터를 굴리는 마인드가 멋지다.

PS : 영문이라 우리말로 편하게 보고 싶다면 슈아이한님이 번역한 글을 보면 된다.