코테 환경 설정 (c++, vscode, m1 mac) - bits/stdc++.h

hunnypooh·2024년 2월 16일
post-thumbnail

글을 쓰게 된 이유
정말 지긋지긋했다. coderunner, cpp 설정을 계속 바꿔도 안됬어서 노션에 적어가며 시도했었지만 일단 코테 문제를 푸는게 중요해서 stdc++을 안 쓰고 관련 헤더를 다 include 해서 사용했었다.

구글링에서는 단편적인 사례밖에 안 나오고, 그마저도 적용해도 다른 문제점들이 있어서 그런지 해결이 아예 안됬다.

결론은 완전하게 해결했고, 목차에서 관련 문제점을 찾아서 보거나 처음부터 보면서 검사하면서 체크해보세요(관심과 좋아요는 글을 더 쓰게 만듭니다)

환경 :

  • m1 macbook pro
  • VSC(visual studio code)
  • extesion : c/c++, coderunner(cmd+r로 실행하려고 사용)

문제 1 : stdc++.h include 오류

지금은 오류가 없어 보이는데, 원래 1번째 줄에 빨간 물결 표시로 include path 오류가 있다고 나왔다.

해결 1 : c_cpp_properties.json에 추가

여기서 installedDir 부분을 c_cpp_properties.json includePath에 추가하면 됨.

{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${workspaceFolder}/**",
                "/Library/Developer/CommandLineTools/usr/bin"
            ],
            "defines": [
                "/Zc:__cplusplus=201703L"
            ],
            "macFrameworkPath": [
                "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
            ],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "macos-clang-arm64"
        }
    ],
    "version": 4
}

설정 들어가는 방법 : cmd+shift+p 에서 저기 들어가서 c/c++ : select configuration 클릭 -> json 으로 보기 클릭.

결과 : 물결 사라짐.

문제 2 : cout 안되거나 실행 시 콘솔에 #include ... 오류난다고 표시됨

stdc++.h가 해결됬다고 올린 글 중에서 stdc++.h만 include 한게 아니라, iostream도 include한게 있었다. iostream을 include한걸 정리한 걸 까먹거나 해결이 안될 확률이 크다. (다른거 include 안하려고 stdc++.h 쓰는건데..)

stdc++.h 안에서 오류 표시가 났다는 건 stdc++.h를 잘못 복사했다고 생각해서 다시 복붙했다.

해결 2 : stdc++.h 내용 제대로 복사

clang --version 을 콘솔에 입력해서 나온 includepath에서 bin 폴더 전에 include/bits 폴더 들어가서 stdc++.h 만들어서 하면 됨.

vi stdc++.h 입력해서 vim으로 띄워서 :%d로 모든 내용 지우고 a 입력해서 복붙하고 :wq 로 저장하고 나오면 됨.

#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>

#if __cplusplus >= 201103L
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#endif

  // C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator> 
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#endif

결과 : cout, queue, vector 등을 include 안해도 됨

문제 3 : auto, for(int v:{1,2}) 에서 에러

이런 식으로 initializer_list가 없다고 하는데, 복붙한 stdc++.h 파일에는 저 부분이 있었다.

if __cplusplus >= .. 부분이 뭔지 검색했더니 저 버전 이후에서는 아래 헤더가 포함된다는 말 이고, 201103L이 c++11 이었다.

그 전까지는 include가 적용이 되니까 컴파일러 버전 문제가 의심이 됬다. 코테 보는 프로그래머스 사전 테스트에서 처봤을때는 c++17 이어서 똑같이 환경 설정을 해도 된다고 판단하고 진행함.

#include <bits/stdc++.h>

using namespace std;
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);  // cin.tie(0);
    cout << "__cplusplus value: " << __cplusplus << endl;
    auto i = 1;
    cout<<i<<'\n';

    return 0;
}

아니나 다를까 버전 c++11, c++17이 아니었음

체크 1
: 맥북 컴파일러의 clang 버전 확인

14.0.3 버전은 C++17 을 지원함.

판단 1
: 맥북 컴파일러는 C++17 지원 하는데, vscode에서 실행할때 일부러 낮춰서 실행하는 중.

체크 2
: c_cpp_propertis.json으로 c/c++ 확장 프로그램 설정 확인

c++17로 잘 되어있는거 확인

판단 2
: 중간에 다른 설정이 바꾸는 중인듯.

해결 3 : coderunner 설정에서 c++ 컴파일러 버전 수정

coderunnner 설정을 수정했더니 됨.

아무거나 설정에서 settings.json으로 편집 클릭해서 들어가서 c++ 검색하기.

g++과 $fileName 사이에 -std=c++17 넣어주면 됨.

드디어 201703으로 바뀜.

#include <bits/stdc++.h>

using namespace std;
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);  // cin.tie(0);
    cout << "__cplusplus value: " << __cplusplus << endl;
    auto i = 1;
    cout<<i<<'\n';
    for(int nv : { 2, 4, 5 }) {
       cout<<nv<<endl;
    }
    return 0;
}

실행하니까 nv 부분도 에러 발생 x.

여담 : task.json 에서 stdc++ 추가해도 안 바뀜. coderunner 설정에서 추가하면 task.json 설정 건드리지 않아도 잘 돌아감

<- 이렇게 넣어서 해결했다는 글 봤는데 나는 그래도 안됬음.

샤라웃

해결 1 관련
해결 2 관련
해결 3 관련

profile
간단한것들 정리

0개의 댓글