구글 C++ 스타일 가이드


구글 C++ 스타일 가이드 대하여 설명드립니다. 코딩 규칙인 스타일 가이드가 필요한 이유와 코딩 스타일을 쉽게 검증하기 위한 cpplint 툴 등에 대해서 사용방법을 예제 코드로 함께 설명 드리도록 하겠습니다.

구글 C++ 스타일 가이드에 대한 전체 문서는 아래의 페이지에서 확인 하실 수 있습니다.

Google C++ Style Guide

코딩 규칙이 필요한 이유

소스코드 가독성을 높임

코딩 규약은 코드 작성자 보다 코드를 읽는 사람을 위한 배려입니다.

규칙적 으로 코드를 작성하여였을 경우, 해당 규약에 적응된 사람은 거부감 또는 부담감 없이 편하게 읽을 수 있습니다. 코드를 작성하는 개발자라고 하더라도 익숙한 코딩 규약이 적용된 오픈소스나 API 등을 사용하는 경우 자기 스스로가 작성한 코드처럼 다른 사람의 코드가 편하게 느껴질 수 있습니다.

오류 가능성을 줄임

헤더 파일등을 작성 할 때에는 전처리 구문등이 스타일에서 의무적으로 사용되어져야 합니다. 이는 헤더 파일등이 여러번 소스코드에 포함되어 오류가 발생될 가능성을 방지합니다.

이외의 여러 사람드이 협업 할때에 도움이 될 수 있을 뿐만 아니라, 소스코드 리펙토링 및 유지보수 등에도 도움이 됩니다.

C++ 버전

구글의 C++ 코딩 규칙 문서는 C언어의 문법을 포함하여, C++11 버전을 대상으로 합니다. 아직 C++14 또는 C++17 등 문법의 특징을 지원하고 있지 않습니다.

구글 C++ 스타일 가이드

구글 C++ 스타일 가이드 문서에는 헤더파일, 클래스, 함수등 전체 개발과 관련하여 많은 규칙에 대해 설명하고 있습니다. 띄어쓰기와 주석까지 자세한 부분이 설명되었지만 그대로 익혀서 사용하기 어렵습니다.

하지만 cpplint 라는 Python 패키지 모듈을 이용하여 소스코드의 파일에 C++ 스타일 가이드를 적용하여 테스트 하면 훨씬 빠르게 배워 나갈 수 있습니다. 잘 못된 부분과 이유등을 확인 할 수 있는데, 예제를 통해서 직접 설명드리도록 하겠습니다.

먼저, cpplint Python 모듈이 설치되지 않았을 경우 아래의 명령어로 설치해 주시기 바랍니다.

$ sudo -H pip install cpplint

예제 소스코드 다운로드

이 글에 사용되는 테스트 소스코드는 아래의 명령어로 다운 받으실 수 있습니다.

$ git clone https://hiseon.me/reps/google-cc-style-example.git

아래의 내용은 예제 소스코드 중에서 a.cc 파일의 내용으로 구글 C++ 스타일 가이드가 적용되지 않은 소스코드 입니다.

#include <stdio.h>

int sum(int a, int b);

int main()
{
  for (int i=0;i<10;i++)
  {
    printf("hello, world\n");
  }

  return 0;
}

int sum(int a, int b){
  return a+b;// 덧셈을 계산
}

cpplint 툴로 테스트하면 다음과 같은 에러들이 나타납니다. 발행한 에러 메세지를 설명드리면 다음과 같습니다.

  • No copyright message found : 소스코드의 저작권표시가 없습니다.
  • { should almost always be at the end of the previous line : ‘{‘ 는 거의 대부분 이전 줄 마지막에 위치해야 합니다.
  • Missing spaces around < : for 문법 내부 조건문 비교 구문 < 에서 공백을 띄워야 합니다.
  • Missing space after ; : for 문 내부 ; 구문에서 공백을 띄워야 합니다.
  • Missing space before { : ‘{‘ 이전에 공백이 필요합니다.
  • At least two spaces is best between code and comments : 코드와 주석 사이에는 최소 두칸의 공백을 띄어야 합니다.

그리고 아래의 소스코드는 b.cc 파일의 내용으로 구글 C++ 스타일 가이드에 맞춰서 수정한 내용입니다. cpplint 으로 테스트 해본 결과 오류가 없음을 알 수 있습니다.

/*!
 *     Copyright:  Copyright (c) 2019, HiSEON.me
 */

#include <stdio.h>

int sum(int a, int b);

int main() {
  for (int i=0; i < 10; i++) {
    printf("hello, world\n");
  }

  return 0;
}

int sum(int a, int b) {
  return a+b;  // 덧셈을 계산
}

a.cc 파일과 b.cc 파일의 차이는 아래와 같습니다.

--- a.cc	2019-06-08 01:11:29.327571029 +0000
+++ b.cc	2019-06-08 01:11:29.327571029 +0000
@@ -1,17 +1,19 @@
+/*!
+ *     Copyright:  Copyright (c) 2019, HiSEON.me
+ */
+
 #include <stdio.h>
 
 int sum(int a, int b);
 
-int main()
-{
-  for (int i=0;i<10;i++)
-  {
+int main() {
+  for (int i=0; i < 10; i++) {
     printf("hello, world\n");
   }
 
   return 0;
 }
 
-int sum(int a, int b){
-  return a+b;// 덧셈을 계산
+int sum(int a, int b) {
+  return a+b;  // 덧셈을 계산
 }

Google에서 개발된 C++ 테스트 프레임 워크인 gtest 사용법에 대해서는 아래의 글을 참고해 주시기 바랍니다.

Google Test 사용법 예제

( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)