37
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

それ import std で ー bits/stdc++.h 論争に決着! C++ 標準ライブラリのモジュール化

Last updated at Posted at 2020-09-30

要約

C++23以降ではimport std;と書けばすべての標準ライブラリが使えます。

言語機能としてのモジュール

C++20では、#includeを置き換える新しいファイル分割の仕組みとしてモジュールが導入されました。

モジュールは「ファイルの内容をその場に展開する」という原始的な仕組みの#includeとは異なり、モジュール毎にコンパイルされます。
翻訳単位の肥大化が抑えられる事と、それぞれのモジュールが何度もコンパイルされることがない事から、コンパイル時間の短縮につながることが期待されています。

MSVC 16.8でモジュールが完全サポートされる(予定)など、実装も揃いつつあります。

ただし、言語機能としてのモジュールは導入されたものの、標準でモジュールとして提供されるライブラリはありません1

標準ライブラリのモジュール化

C++23では、ついに標準ライブラリがモジュール化されます。

モジュール std

モジュール std は、C++標準ライブラリ全体を含むモジュールです。以下のようにインポートすると、すべての機能が使えるようになります。

import std;

std はグローバル名前空間には何も導入しません。

モジュール std.compat

モジュール std.compat は、モジュール std の内容に加えて、グローバル名前空間にもC言語互換ライブラリの内容を導入します。これは、古いコードをモジュールベースに書き換えるとき、互換性を保つために使用できます。

例えば、std をインポートした場合、 printf 関数は std 名前空間にのみ導入されます。std.compat をインポートすると、std 名前空間とグローバル名前空間の両方に導入されます。

マクロ

stdstd.compat のいずれも、マクロは含みません。

C++20の仕様により、モジュールはマクロをエクスポートできません

標準ライブラリで定義されるマクロを使いたい場合は、引き続きヘッダーファイルを #include するか、ヘッダーユニットとしてインポートする必要があります。

以前の提案

以前、以下のようなサブモジュールが提案されていました(P0581R1 Standard Library Modules)。

C++23では、最小限のサポートとして標準ライブラリ全体を含むモジュールだけが採用され、これらのサブモジュールは採用されていません

  • モジュール std.fundamental
    <cstddef><limits><cfloat><cstdint><new><typeinfo><exception><initializer_list><csignal><csetjump><cstdlib><stdexcept><system_error><utility><tuple><optional><variant><any><bitset> (I/Oのフォーマット宣言を除く)、<type_traits><ratio><chrono><ctime><atomic><typeindex><memory>のうちstd::unique_ptrstd::shared_ptrおよび関連するクラスと関数
  • モジュール std.core
    std.fundamentalの再エクスポート、<array><list><forward_list><vector><deque><queue><stack><map><set><unordered_map><unordered_set><iterator><algorithm><execution><functional><string_view><string>(I/Oのフォーマット宣言を除く)、<memory>std.fundamentalに入らなかった部分、<memory_resource><scoped_allocator><regex>
  • モジュール std.io
    <cctype><cwctype><cwchar><cstdlib><cuchar><locale><codecvt><clocale><iosfwd><iostream><ios><streambuf><istream><ostream><iomanip><sstream><fstream><cstdio><complex>のI/Oフォーマット宣言、<string>のI/Oフォーマット宣言、<bitset>のI/Oフォーマット宣言
  • モジュール std.os
    <filesystem>
  • モジュール std.concurrency
    <mutex><thread><condition_variable><shared_mutex><future>
  • モジュール std.math
    <complex> (I/Oのフォーマット宣言を除く)、<numeric><valarray><random><cmath>

bits/stdc++.h とは

特定の処理系で提供される、標準ライブラリをすべてインクルードしている便利なヘッダーです。移植性は皆無ですが競技ではよく使われています。

C++23以降では、#include "bits/stdc++.h"の代わりにimport std;と書けます。これは標準ライブラリであり、ポータブルです😃

参考リンク

  1. 標準C++ライブラリにはヘッダーユニットという救済措置があります。

37
23
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
37
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?