0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Mac OS 環境で stdc++.h をインクルードする

Posted at

概要

タイトルにある通り,Mac OS 環境で stdc++.h をインクルードする方法を説明します.

きっかけ

AtCoder に取り組むようになり,何度も c++ のプログラムを書くようになり,その度に複数のヘッダをインクルードするのが面倒であることに気づきました.
そこで,AtCoder の解き方を調べたところ,テンプレートを作成して使い回すのが一般的であると知りました.特にインクルード文に関しては というものをインクルードすれば,ほとんどの関数が使えるようになることを知り,以下のように使用してみました.

test.cpp
#include <bits/stdc++.h>
int main()
{
    std::cout << "Hello World" << std::endl;
}

しかし, Mac OS 環境でコンパイルしてみるとこのようにコンパイルエラーになりました.

$> c++ -std=c++20 test.cpp
A.cpp:1:10: fatal error: 'bits/stdc++.h' file not found
    1 | #include <bits/stdc++.h>
      |          ^~~~~~~~~~~~~~~
1 error generated.

どうやら,Mac OS のデフォルトでは bits/stdc++.h ファイルはないみたい?です.
ちなみに,Linux 環境で同様にコンパイルしたところ,問題なくコンパイルできました.

インターネットで検索するとさまざまな解決策が出てきましたが,自分の環境ではうまく行かなかったです.
そこで,自分の Mac OS 上で stdc++.h をインクルードできるようになった手順をまとめました.

stdc++.h をインクルードする方法

任意の階層で bits ディレクトリを作成します.
bits ディレクトリ内に stdc++.h というファイルを作り,以下の stdc++.h をコピーします.
最後に bits ディレクトリを /usr/local/include にコピーします.
これで, Mac OS 上でも stdc++.h をコンパイルできるようになりました!

$> mkdir bits
$> cp stdc++.h bits/stdc++.h
$> sudo cp -r bits /usr/local/include
stdc++.h
stdc++.h
// C++ includes used for precompiling -*- C++ -*-

// Copyright (C) 2003-2015 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.

/** @file stdc++.h
 *  This is an implementation file for a precompiled header.
 */

// 17.4.1.2 Headers

// C
#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

チップ

自分がうまく行かなかった理由としては,github からコピーした stdc++.h に c++ 20 では削除されている stdalign が含まれていたことが原因でした.

$> c++ -std=c++20 test.cpp
In file included from A.cpp:1:
/usr/local/include/bits/stdc++.h:55:10: fatal error: 'cstdalign' file not found
   55 | #include <cstdalign>
      |          ^~~~~~~~~~~
1 error generated.

↓今回コピーした stdc++.h のリンク
stdc++.h

stdalign について

ヘッダーでは、C++ のキーワードであるマクロが定義されているため、これを含めることに効果はありません。 ヘッダーは C++ では非推奨とされます。 ヘッダーは C++ 17 では非推奨とされており、ドラフト C++ 20 標準では削除されています。

備考

不備などございましたら,教えていただけると幸いです.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?