본문 바로가기
개발 기본 규칙 및 환경설정

[기본 규칙] C++ 코딩컨벤션

by cogito21_cpp 2024. 7. 5.
반응형

공통 규칙

  1. 인덴테이션(들여쓰기)
    • 4칸 스페이스를 사용합니다. (탭 대신 스페이스를 사용합니다)
    • 일관된 인덴테이션 스타일을 유지합니다.
    void myFunction() {
        if (condition) {
            // code block
        } else {
            // code block
        }
    }
  2. 브레이스 스타일
    • K&R 스타일 또는 Allman 스타일을 사용합니다.K&R 스타일:Allman 스타일:
  3. void myFunction() { if (condition) { // code block } }
  4. void myFunction() { if (condition) { // code block } }
  5. 주석
    • 한 줄 주석: // 사용
    • 여러 줄 주석: /* ... */ 사용
    • 함수, 클래스, 복잡한 논리에 대해 주석 작성
    // 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;
    }
  6. 공백 및 정렬
    • 연산자 주위에 공백을 사용합니다.
    • 함수 호출에서 인자 사이에 공백을 사용하지 않습니다.
    • 콤마 뒤에 공백을 사용합니다.
    int result = a + b;
    myFunction(a, b, c);
  7. 줄 바꿈
    • 80자 이상이 되지 않도록 줄 바꿈을 합니다.
    • 긴 줄은 적절한 위치에서 줄 바꿈을 합니다.
    if (veryLongCondition1 && veryLongCondition2 &&
        veryLongCondition3 && veryLongCondition4) {
        // code block
    }
  8. 컨디셔널 문
    • 한 줄의 컨디셔널 문이라도 중괄호 {}를 사용합니다.
    if (condition) {
        // code block
    } else {
        // code block
    }

네이밍 컨벤션

  1. 변수명
    • 소문자로 시작하고, 단어 사이는 밑줄(_)로 구분합니다. (snake_case)
    int my_variable;
  2. 함수명
    • 소문자로 시작하고, 단어 사이는 밑줄(_)로 구분합니다. (snake_case)
    void my_function();
  3. 클래스명
    • 대문자로 시작하고, 단어 사이는 대문자로 구분합니다. (PascalCase)
    class MyClass {
        // class definition
    };
  4. 상수명
    • 모든 글자를 대문자로 작성하고, 단어 사이는 밑줄(_)로 구분합니다. (UPPER_SNAKE_CASE)
    const int MAX_VALUE = 100;
  5. 멤버 변수
    • 클래스의 멤버 변수는 밑줄(_)로 시작하거나 끝에 밑줄을 붙입니다.
    class MyClass {
        int my_variable_;
    };
  6. 네임스페이스
    • 소문자로 시작하고, 단어 사이는 밑줄(_)로 구분합니다.
    namespace my_namespace {
        // namespace contents
    }
  7. 열거형 상수
    • 대문자로 시작하고, 단어 사이는 밑줄(_)로 구분합니다.
    enum Color {
        RED,
        GREEN,
        BLUE
    };
  8. 전역 변수
    • g_ 접두사를 붙이고 소문자로 시작합니다.
    int g_global_variable;
  9. 포인터 변수
    • 변수명 뒤에 _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;
}

추가 코딩 컨벤션

  1. 파일 구성
    • 파일 이름은 소문자로 작성하고, 단어 사이는 밑줄(_)로 구분합니다.
    • 헤더 파일의 확장자는 .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
    또는
  2. // my_class.h #pragma once class MyClass { // class definition };
  3. include 문
    • 표준 라이브러리 헤더는 꺾쇠 괄호(< >)를 사용하고, 사용자 정의 헤더는 큰 따옴표(" ")를 사용합니다.
    • 필요한 헤더만 포함하고, 파일 상단에 모아서 작성합니다.
    #include <iostream>
    #include "my_class.h"
  4. 매크로
    • 매크로는 대문자로 작성하고, 단어 사이는 밑줄(_)로 구분합니다.
    • 매크로 사용을 최소화하고, 상수나 인라인 함수를 사용하는 것이 좋습니다.
    #define MAX_BUFFER_SIZE 1024
  5. 포인터와 참조
    • 포인터 변수 선언 시, *는 변수명에 붙여 씁니다.
    • 참조 변수 선언 시, &는 변수명에 붙여 씁니다.
    int* ptr;
    int& ref = variable;
  6. 네임스페이스 사용
    • 네임스페이스를 사용하여 전역 변수와 함수의 충돌을 피합니다.
    • 네임스페이스는 소문자와 밑줄(_)을 사용하여 구분합니다.
    namespace my_namespace {
        void my_function() {
            // function definition
        }
    }

추가 네이밍 컨벤션

  1. 템플릿 타입 매개변수
    • 템플릿 타입 매개변수는 대문자 T로 시작하고, 필요한 경우 설명적인 이름을 사용합니다.
    template <typename T>
    class MyClass {
        T value_;
    };
    
    template <typename KeyType, typename ValueType>
    class MyMap {
        // class definition
    };
  2. 인터페이스 클래스
    • 인터페이스 클래스의 이름은 대문자 I로 시작합니다.
    class IDrawable {
        virtual void draw() const = 0;
    };
  3. 이벤트 핸들러
    • 이벤트 핸들러 함수는 on_ 접두사로 시작합니다.
    void on_click() {
        // handle click event
    }
  4. 테스트 함수
    • 테스트 함수는 test_ 접두사로 시작합니다.
    void test_my_function() {
        // test code for my_function
    }
  5. 접근자와 설정자
    • 접근자 함수는 get_ 접두사로 시작합니다.
    • 설정자 함수는 set_ 접두사로 시작합니다.
    class MyClass {
    public:
        int get_value() const {
            return value_;
        }
    
        void set_value(int value) {
            value_ = value;
        }
    
    private:
        int value_;
    };
  6. Boolean 변수
    • Boolean 변수는 is_, has_, can_, should_ 등의 접두사로 시작합니다.
    bool is_valid;
    bool has_permission;
    bool can_execute;
    bool should_proceed;

고급 예제 코드

아래는 위의 추가 규칙을 포함한 예제 코드입니다.

// 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 개발자:티스토리]

반응형