반응형
공통 규칙
- 인덴테이션(들여쓰기)
- 4칸 스페이스를 사용합니다. (탭 대신 스페이스를 사용합니다)
- 일관된 인덴테이션 스타일을 유지합니다.
void myFunction() { if (condition) { // code block } else { // code block } }
- 브레이스 스타일
- K&R 스타일 또는 Allman 스타일을 사용합니다.K&R 스타일:Allman 스타일:
void myFunction() { if (condition) { // code block } }
void myFunction() { if (condition) { // code block } }
- 주석
- 한 줄 주석:
//
사용 - 여러 줄 주석:
/* ... */
사용 - 함수, 클래스, 복잡한 논리에 대해 주석 작성
// This is a single line comment /* * This is a multi-line comment */
- 함수 및 메서드 주석 예제
/** * Adds two integers and returns the result. * * @param a First integer * @param b Second integer * @return Sum of a and b */ int add(int a, int b) { return a + b; }
- 한 줄 주석:
- 공백 및 정렬
- 연산자 주위에 공백을 사용합니다.
- 함수 호출에서 인자 사이에 공백을 사용하지 않습니다.
- 콤마 뒤에 공백을 사용합니다.
int result = a + b; myFunction(a, b, c);
- 줄 바꿈
- 80자 이상이 되지 않도록 줄 바꿈을 합니다.
- 긴 줄은 적절한 위치에서 줄 바꿈을 합니다.
if (veryLongCondition1 && veryLongCondition2 && veryLongCondition3 && veryLongCondition4) { // code block }
- 컨디셔널 문
- 한 줄의 컨디셔널 문이라도 중괄호
{}
를 사용합니다.
if (condition) { // code block } else { // code block }
- 한 줄의 컨디셔널 문이라도 중괄호
네이밍 컨벤션
- 변수명
- 소문자로 시작하고, 단어 사이는 밑줄(
_
)로 구분합니다. (snake_case)
int my_variable;
- 소문자로 시작하고, 단어 사이는 밑줄(
- 함수명
- 소문자로 시작하고, 단어 사이는 밑줄(
_
)로 구분합니다. (snake_case)
void my_function();
- 소문자로 시작하고, 단어 사이는 밑줄(
- 클래스명
- 대문자로 시작하고, 단어 사이는 대문자로 구분합니다. (PascalCase)
class MyClass { // class definition };
- 상수명
- 모든 글자를 대문자로 작성하고, 단어 사이는 밑줄(
_
)로 구분합니다. (UPPER_SNAKE_CASE)
const int MAX_VALUE = 100;
- 모든 글자를 대문자로 작성하고, 단어 사이는 밑줄(
- 멤버 변수
- 클래스의 멤버 변수는 밑줄(
_
)로 시작하거나 끝에 밑줄을 붙입니다.
class MyClass { int my_variable_; };
- 클래스의 멤버 변수는 밑줄(
- 네임스페이스
- 소문자로 시작하고, 단어 사이는 밑줄(
_
)로 구분합니다.
namespace my_namespace { // namespace contents }
- 소문자로 시작하고, 단어 사이는 밑줄(
- 열거형 상수
- 대문자로 시작하고, 단어 사이는 밑줄(
_
)로 구분합니다.
enum Color { RED, GREEN, BLUE };
- 대문자로 시작하고, 단어 사이는 밑줄(
- 전역 변수
- g_ 접두사를 붙이고 소문자로 시작합니다.
int g_global_variable;
- 포인터 변수
- 변수명 뒤에 _ptr를 붙입니다.
int* my_variable_ptr;
예제 코드
아래는 위의 컨벤션을 적용한 예제 코드입니다.
#include <iostream>
namespace my_namespace {
const int MAX_COUNT = 100;
/**
* MyClass는 카운터를 증가시키고 값을 반환하는 클래스입니다.
*/
class MyClass {
public:
MyClass() : count_(0) {}
/**
* 카운터를 증가시킵니다.
*/
void increment_count() {
if (count_ < MAX_COUNT) {
++count_;
}
}
/**
* 현재 카운터 값을 반환합니다.
*
* @return 현재 카운터 값
*/
int get_count() const {
return count_;
}
private:
int count_;
};
}
int main() {
my_namespace::MyClass obj;
obj.increment_count();
std::cout << "Count: " << obj.get_count() << std::endl;
return 0;
}
추가 코딩 컨벤션
- 파일 구성
- 파일 이름은 소문자로 작성하고, 단어 사이는 밑줄(
_
)로 구분합니다. - 헤더 파일의 확장자는
.h
또는.hpp
, 소스 파일의 확장자는.cpp
를 사용합니다. - 헤더 파일에는 include guard 또는
#pragma once
를 사용합니다.
또는// my_class.h #ifndef MY_CLASS_H #define MY_CLASS_H class MyClass { // class definition }; #endif // MY_CLASS_H
- 파일 이름은 소문자로 작성하고, 단어 사이는 밑줄(
// my_class.h #pragma once class MyClass { // class definition };
- include 문
- 표준 라이브러리 헤더는 꺾쇠 괄호(
< >
)를 사용하고, 사용자 정의 헤더는 큰 따옴표(" "
)를 사용합니다. - 필요한 헤더만 포함하고, 파일 상단에 모아서 작성합니다.
#include <iostream> #include "my_class.h"
- 표준 라이브러리 헤더는 꺾쇠 괄호(
- 매크로
- 매크로는 대문자로 작성하고, 단어 사이는 밑줄(
_
)로 구분합니다. - 매크로 사용을 최소화하고, 상수나 인라인 함수를 사용하는 것이 좋습니다.
#define MAX_BUFFER_SIZE 1024
- 매크로는 대문자로 작성하고, 단어 사이는 밑줄(
- 포인터와 참조
- 포인터 변수 선언 시,
*
는 변수명에 붙여 씁니다. - 참조 변수 선언 시,
&
는 변수명에 붙여 씁니다.
int* ptr; int& ref = variable;
- 포인터 변수 선언 시,
- 네임스페이스 사용
- 네임스페이스를 사용하여 전역 변수와 함수의 충돌을 피합니다.
- 네임스페이스는 소문자와 밑줄(
_
)을 사용하여 구분합니다.
namespace my_namespace { void my_function() { // function definition } }
추가 네이밍 컨벤션
- 템플릿 타입 매개변수
- 템플릿 타입 매개변수는 대문자
T
로 시작하고, 필요한 경우 설명적인 이름을 사용합니다.
template <typename T> class MyClass { T value_; }; template <typename KeyType, typename ValueType> class MyMap { // class definition };
- 템플릿 타입 매개변수는 대문자
- 인터페이스 클래스
- 인터페이스 클래스의 이름은 대문자
I
로 시작합니다.
class IDrawable { virtual void draw() const = 0; };
- 인터페이스 클래스의 이름은 대문자
- 이벤트 핸들러
- 이벤트 핸들러 함수는
on_
접두사로 시작합니다.
void on_click() { // handle click event }
- 이벤트 핸들러 함수는
- 테스트 함수
- 테스트 함수는
test_
접두사로 시작합니다.
void test_my_function() { // test code for my_function }
- 테스트 함수는
- 접근자와 설정자
- 접근자 함수는
get_
접두사로 시작합니다. - 설정자 함수는
set_
접두사로 시작합니다.
class MyClass { public: int get_value() const { return value_; } void set_value(int value) { value_ = value; } private: int value_; };
- 접근자 함수는
- Boolean 변수
- Boolean 변수는
is_
,has_
,can_
,should_
등의 접두사로 시작합니다.
bool is_valid; bool has_permission; bool can_execute; bool should_proceed;
- Boolean 변수는
고급 예제 코드
아래는 위의 추가 규칙을 포함한 예제 코드입니다.
// my_class.h
#pragma once
#include <string>
namespace my_namespace {
const int MAX_BUFFER_SIZE = 1024;
class ISerializable {
public:
virtual std::string serialize() const = 0;
};
template <typename T>
class MyClass : public ISerializable {
public:
MyClass(T value) : value_(value) {}
T get_value() const {
return value_;
}
void set_value(T value) {
value_ = value;
}
std::string serialize() const override {
return std::to_string(value_);
}
private:
T value_;
};
void on_event() {
// handle event
}
void test_my_class() {
MyClass<int> obj(10);
obj.set_value(20);
}
}
int main() {
my_namespace::MyClass<int> obj(5);
obj.set_value(10);
std::cout << "Value: " << obj.get_value() << std::endl;
return 0;
}
출처: https://dataanalysiswithpython.tistory.com/entry/개발-기본-규칙-C-코딩-컨벤션-및-네이밍-컨벤션 [Python 개발자:티스토리]
반응형
'개발 기본 규칙 및 환경설정' 카테고리의 다른 글
[환경설정] Python 환경설정 (0) | 2024.07.19 |
---|---|
[기본 규칙] C++ 프로젝트 구조 (0) | 2024.07.05 |
[기본 규칙] C 프로젝트 구조 (0) | 2024.07.05 |
[기본 규칙] C 코딩컨벤션 (0) | 2024.07.05 |
[환경설정] C++ 환경설정 (0) | 2024.07.05 |