このページはC++26に採用される見込みの言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
概要
C++20でモジュールが導入された際、グローバルモジュールフラグメントより前でのプリプロセッサ制御行がP1857R3によって禁止された。この制限により#lineディレクティブもモジュール宣言より前に書くことができなくなっていた。
C++26では、#lineディレクティブをモジュール宣言より前に記述することが許可される。
#line 1 "A.cppm"
export module a; // C++26: OK (C++20/23: ill-formed)
仕様
モジュールファイルの文法に#lineディレクティブの出現を許可するよう変更される。具体的には、グローバルモジュールフラグメントの有無にかかわらず、モジュール宣言より前に#lineディレクティブを記述できる。
この機能が必要になった背景・経緯
build2、ccache、distccなどのビルドツールは、前処理済みの出力をコンパイラに再入力することに依存しており、その出力には通常#lineディレクティブが含まれている。しかし、モジュール宣言より前での制御行が禁止されていたため、以下のような前処理済み出力がコンパイルできなかった。
#line 1 "A.cppm"
export module a;
この制限は過度であり、#lineディレクティブはコードの意味に影響を与えないため、禁止する理由がなかった。