bits/stdc++.h란?
C++ 표준 라이브러리의 여러 헤더 파일들을 한꺼번에 포함하는 비표준 헤더 파일입니다. 주로 코테에서 코드 작성 시간을 단축하기 위해 사용됩니다. 이 헤더 파일은 모든 c++ 표준 헤더 파일을 포함하기 때문에, 개발자가 여러 개의 헤더 파일을 일일이 #include할 필요 없이 한 번에 모든 표준 라이브러리를 사용할 수 있어 코드 작성 시간을 단축해주고, 헤더를 잘못 가져오는 등의 실수를 방지 때문에 유용하게 쓰입니다
비공식 헤더 파일이므로, GCC 컴파일러에서만 기본적으로 제공됩니다. Clang이나 MSVC 같은 다른 컴파일러에서는 이 헤더 파일이 기본적으로 포함되지 않으며, 직접 생성해야 사용 할 수 있습니다. mac의 경우 clang 을 사용하여 cpp파일을 컴파일하므로 역시 직접 추가하여 사용해야합니다.
bits/stdc++.h를 직접 추가하여 사용하기
보통 clang 이 설치된 위치에 include 폴더 내부에서 bits 폴더를 만들고 그 안에 stdc++.h 파일을 생성합니다.
그리고 그 파일 안에 c++의 표준 헤더 파일들을 넣어둡니다. 이를 통해 한번에 모든 c++ 표준 헤더 파일을 가져와서 사용할 수 있게 해주는 bits/stdc++.h 헤더파일이 완성됩니다.
문제 상황
C++ 코드를 작성할 때 #include <bits/stdc++.h> 사용 시 다음과 같은 오류가 발생했습니다.
fatal error: 'bits/stdc++.h' file not found
컴파일러가 bits/stdc++.h파일을 못찾고있는 것 입니다
여러군데 서치를 해본 결과, 다른 분들은 clang 설치 경로가 /Library/Developer/CommandLineTools/usr/include 인데, 저는 root 권한으로도 수정할 수 없는 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain 경로에 clang이 설치되어 있었습니다. 이 경로에는 sudo를 사용해도 파일을 추가할 수 없어서, 다른 방법이 필요했습니다
해결 방법
가장 안전한 방법을 선택하고자 대체 경로(= 임의의 위치에 bits/stdc++.h 헤더 파일을 만듦. 추후 설정을 통해 clang이 이 파일을 가져와서 사용하도록 함)를 사용하기로 했습니다. bits/stdc++.h는 표준 헤더 파일이 아니므로 직접 파일을 추가하고, 그 파일을 컴파일러가 찾을 수 있도록 대체 경로를 설정하는 방법을 사용했습니다. 이를 위해 my_include라는 폴더를 만들고, VSCode에서 이를 참조하도록 설정에서 경로를 추가했습니다.
1. 대체 경로에 bits/stdc++.h 헤더 파일 추가
- 먼저, 홈 디렉터리(cd /Users/유저이름) 에 my_include라는 폴더를 만들고, 그 안에 bits라는 폴더를 생성합니다
mkdir -p ~/my_include/bits
- bits/stdc++.h 파일을 생성하고, 인터넷에서 제공되는 파일 내용을 복사하여 붙여 넣습니다
touch ~/my_include/bits/stdc++.h
bits/stdc++.h 파일내용은 아래 블로그에서 다운받을 수 있습니다
https://miniolife.tistory.com/11
Visual Studio에서 <bits/stdc++.h> 사용하기
처음에 알고리즘 문제를 풀다보면 귀찮?까다로운? 점이 include일 것이다. 어떤 헤더 파일에 어떤 함수가 들어있는지도 익숙하지 않고, 컴파일러는 include를 하라고 오류를 뱉어댄다. 어느 헤더 파
miniolife.tistory.com
2. VSCode 설정 파일 수정
c_cpp_properties.json 설정
- c_cpp_properties.json에서 includePath에 대체 경로를 추가하여, IntelliSense가 이 경로를 참조할 수 있도록 설정했습니다.
- vscode에서 command + shift + P를 눌러 **C/C++: Edit Configurations(JSON)** 을 선택하여 파일을 열 수 있습니다.
{
//c_cpp_properties.json
"configurations": [
{
"name": "Mac",
"includePath": ["${workspaceFolder}/**", "~/my_include"],
"defines": [],
"macFrameworkPath": [
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang",
"intelliSenseMode": "macos-clang-arm64"
}
],
"version": 4
}
c_cpp_properties.json 파일은 쉽게말해서 프로그램이 코드를 이해하고, 코드에 필요한 파일을 찾을 수 있도록 필요한 정보를 적어둔 규칙서입니다.
includePath 옵션 : 프로젝트에서 사용해야하는 헤더 파일의 경로를 지정해둡니다. 그리고 컴파일시, 컴파일러와 IntelliSense(= 코드 자동 완성, 문법 검사를 해주는 도구)가 #include 지시문을 만났을 때, 헤더 파일을 찾을 수 있는 경로를 알려주는 역할 입니다.
"${workspaceFolder}/**" : 프로젝트 폴더 내의 모든 파일을 참조하여 헤더 파일을 찾도록 합니다
=> 즉 clang 컴파일러에 있는 시스템 경로에 있는 c++표준 헤더 파일을 찾아서 사용하는 것입니다. 그렇기 때문에 우리가 기존의 c++ 표준 헤더 사용할 때에는 따로 헤더 파일을 일일이 추가하지 않아도 사용가능했던 것입니다. 이 속성은 기본값으로 포함되어있는 속성입니다.
- ${workspaceFolder} = 현재 작업 중인 프로젝트 폴더의 루트 경로
- /** = 모든 하위 폴더, 파일을 의미함
tasks.json 파일 설정
[VSCode] macOS에서 Visual Studio Code로 C/C++ 코딩하기(2) - 디버깅을 위한 tasks.json, launch.json 설정
지난글에서는 VSCode에서 C++ 코드를 '실행(Run)'만 할 수 있는 설정을 했다. [VSCode] macOS에서 Visual Studio Code로 C/C++ 코딩하기(1) - Extension 설치 MacOS에서 Windows의 Visual Studio같은 IDE는 대표적으로 XCode가
junekkk.tistory.com
{ //tasks.json
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-I",
"~/my_include",
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": ["$gcc"],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
"-I" 옵션: 이 옵션은 위에서 언급했듯이 컴파일러가 추가적인 헤더 파일을 찾을 경로를 알려주는 역할을 합니다.
저는 ~/my_include 경로(내가 만든 폴더)를 참조하게 했습니다.
번외로..
- bits/stdc++.h는 비표준 헤더 파일이므로, 가능한 경우 표준 라이브러리 헤더 파일들을 직접 포함하는 것이 좋다고 한다.
- bits/stdc++.h가 많은 헤더 파일을 포함하고 있기 때문에, 컴파일 시간이 길어지게 된다.
- bits/stdc++.h를 따로 설정해두지 않은 환경에서는 맨 위와 같은 오류가 뜨게 될 것이다. _ 즉 호환성 문제가 존재한다.
- 무지성 쓰는걸 비판하는 외국 개발자들의 글을 봤다. 물론 코테에서는 시간싸움이기 때문에 가능하면 이 헤더를 잘 활용하는 것이 좋겠지만, 그 외의 경우에는 별로 필요한 헤더도 없는데 괜히 습관적으로 bits/stdc++.h를 써서 컴파일 시간도 늘리고 메모리도 불필요하게 사용하는 일은 없도록 해야겠다.
'기타' 카테고리의 다른 글
python은 왜 가상환경을 사용할까 (python과 javascript 간단히 비교해보기) (2) | 2025.01.03 |
---|---|
깃허브 협업 방식 정리 (1) | 2023.12.20 |
mac m1 tensorflow 설치 중 conda python 버전 관련 에러 해결법 (2) | 2023.02.28 |