vscode c++ formatting

# vscode cpp extenstion 을 설치하고 코드 포맷팅을 하면 엉뚱하게 포맷팅이 된다.
# 이유는 포맷팅 환경이 설정되어 있지 않아서다.
# 우선 clang-format 을 설치하자.
brew install clang-format

# settings.json 을 열어 다음과 같이 설정한다.
"C_Cpp.clang_format_path": "/usr/local/bin/clang-format",

# file 이라고 명시하면 현재 프로젝트의 루트 경로의 .clang-format 파일을 읽어 들인다.
"C_Cpp.clang_format_style": "file",

# format_style 실패시 기본 셋팅(Visual Studio, LLVM, Google, Chromium, Mozilla, WebKit)
"C_Cpp.clang_format_fallbackStyle": "Visual Studio"

# lazyvim(neovim)에서는 conform 플러그인에 cpp 포맷터로 clang-format 을 설정한다.
return {
  "stevearc/conform.nvim", -- For formatting
  opts = {
    -- formatters by file type
    formatters_by_ft = {
      cpp = { "clang-format" },
    },
  },
}

# 프로젝트 루트 위치에 .clang-format 파일을 다음과 같이 설정해 사용할 수 도 있다.
BasedOnStyle: Google
IndentWidth: 4
ColumnLimit: 100
# BreakBeforeBraces: Allman # Always break before braces.
BreakBeforeBraces: Attach # Always attach braces to surrounding context.

# 참고로 현재 경로의 모든 c/cpp 파일 포맷팅 적용
# --style=file 로 지정하면 .clanf-format 파일을 참고한다.
# -i 옵션을 주면 변경된 스타일이 파일에 적용된다.
fd ".c$|.cpp$" --exec clang-format --style=file -i

# 포맷 스타일 결과 비교, main 함수만 발췌
# 개인적으로 visualstudio 또는 google 스타일이 좋은것 같다.

# Visual Studio 는 Clang-format 기본스타일 종류에는 없고 다음과 같이 설정해야한다.
# clang-format --style="{UseTab: Never,IndentWidth: 4,
BreakBeforeBraces: Allman,
AllowShortIfStatementsOnASingleLine: false,
IndentCaseLabels: false,
ColumnLimit: 0}" hello_world.cpp
# 들여쓰기 탭, 시작 중괄호 한줄 차지
int main()
{
    string a = "1";
    if (a == "1")
    {
        cout << "hello world" << endl;
    }
    return 0;
}

# clang-format --style="google" hello_world.cpp
# 들여쓰기 공백2, 시작 중괄호 같은 라인에 시작
int main() {
  string a = "1";
  if (a == "1") {
    cout << "hello world" << endl;
  }
  return 0;
}

# clang-format --style="webkit" hello_world.cpp
# 들여쓰기 공백4, 함수 시작 중괄호만 한줄, 함수내에서는 같은 라인에 시작
int main()
{
    string a = "1";
    if (a == "1") {
        cout << "hello world" << endl;
    }
    return 0;
}

# clang-format --style="mozilla" hello_world.cpp
# 들여쓰기 공백2, 함수 시작 중괄호만 한줄, 함수내에서는 같은 라인에 시작
# 함수 리턴 타임 한줄 차지
int
main()
{
  string a = "1";
  if (a == "1") {
    cout << "hello world" << endl;
  }
  return 0;
}

comments:

댓글 쓰기