[CppCoreGuidelines 한국어 번역] 핵심 가이드라인의 목적은 개발자들이 모던 C++ (현재는 C++17)을 받아들이고 보다 일관적인 형태의 스타일로 코드를 작성하도록 하는 것이다. 이 문서에서 다루고 있는 규칙들이 모든 코드에 효과적으로 적용할 수 있다고 생각하지는 않는다. 오래된 시스템을 새롭게 업그레이드하는 것은 쉽지 않은 일이다. 하지만 여기서 다루는 규칙들을 적용한다면 기존의 방식보다 오류가 발생할 가능성이 낮고, 유지 보수가 편리한 코드를 작성할 수 있을 것이라 확신한다. 또한 이러한 규칙들은 개발 초기에 좀 더 빠르고 쉽게 개발을 진행하는 데도 도움이 될 것이다. 분명히 말할 수 있는 것은, 이러한 규칙들을 적용하면 제로-비용 원칙(Zero-overhead principle)에 입각해 이전보다 더 나은 동작을 수행되는 코드를 만들 수 있다는 점이다. (제로-비용 원칙이란 "사용하지 않는 부분에 비용을 낭비하지 마라.", 또는 "올바른 추상화 메커니즘을 사용했을 경우, 적어도 저수준 언어로 하드코딩한 것 만큼의 성능을 얻을 수 있다." 정도로 설명할 수 있다.) 새로운 코드를 작성하거나 기존 코드를 개선할 여지가 생겼다면, 적용 가능한 수준에서 규칙들을 적용해 보기 바란다.
[내가 받아들이기로 결정한 convention들 from google style과 cppcoreguidelines]:
변수의 선언은 초기화 되는곳과 가장근처에서 선언과 동시에 초기화를 시킨다.
리턴 구문은 여러번 써도 괜찮다.
예외에서는 assert를 사용해라. 그리고 무조건 없는게 효율적이지만은 않다.
namespace는 반드시 사용한다. 그리고 모든 namespace는 프로젝트 이름, 팀이름으로 한다.
Public, protected, private 순으로 선언한다.
파일 관련 헤더, c관련 헤더, c++관련 헤더, stl 관련해더, 그 외의 라이브러리 참조헤더 순으로 적는다.
Using namespace는 사용하지 않는다.
클래스는 public으로 변수는 private으로 한다.
Virtual 보다는 override를 사용한다.
변수 이름은 snake style로 메서드는 camelstyle로, const는 k+파스칼 스타일로 통일 한다.
공백에서 if문과 else문은의 순을 따른다. } else { }
공백은 텝보다는 2번 스페이스바를 이용한다.
주석은 코드를 보고 알수 있는 내용을 담지 않는다. 의도를 쓰고, 간략히 유지한다.
주석의 들여쓰기 스타일을 정의하고 유지한다.
이름은 구체적으로 적는다.
struct가 튜플같은 자료형 보다 구체적으로 정의할수 있어서 낫다.
과한 스페이스는 코드의 혼란을 가중한다. (Int)는 괜찮지만, ( int )는 과하다.
overloading을 할수 있는것은 함수로 선언하지 말라.
인자 타입으로 void는 사용하지 마라.
const는 자주 사용하라.
for문 안에서만 사용하는 변수는 그 안에서만 사용해라. 만약 객체라면 밖에 선언한다.
포인터를 지우는 ownership을 쉽게 넘겨주지 마라.
함수는 단순하게 하나에 한 역할만 하게 한다.
inline함수는 10줄 이하만 사용한다. 또 난발하지 않는다.
보편성을 고려한다면, 스마트 포인터 대신에 T*나 T&의 인자를 사용한다.
입력(in) 매개변수는 복사 비용이 적게 드는 타입의 경우 값으로 전달하고, 그 외에는 상수 참조형으로 전달하라.
넘겨주거나 전달하는 매개변수는 std::move나 std::foward로만 사용한다.
출력값 여러개를 반환할때는 튜플이나 구조체를 선호한다.
함수의 인자 개수를 최소로 유지하라
배열을 단일포인터로 전달하지 마라. 데신,를 사용하라.
Circle arr[10]; draw2(span(arr)); // 원소
null이 되면 안되는 포인터는 not_null로 선언하라.
클래스 계층에 대한 interface로 추상 클래스를 사용해라.
타입이 불변조건을 가진다면, class를 사용하라; 데이터 멤버들에 대한 제약이 자유롭다면 struct를 사용하라
non-public 멤버가 있다면 struct보단 class를 사용하라
생성자에서 예외처리를 하게 만들어 준다.
매크로보다 열거형을 사용하라
unique_ptr이나 shared_ptr을 사용하라.
nullptr이나 ‘\0’을 사용하라.
cast를 최대한 피하고, static_cast<>를 사용해라.
new와 delete함수를 사용해라, 그리고 new와 delete사용은 자원 관리함수 외부에서 피해라.