最終更新日時: 2026年06月25日 15時15分02秒 (JST)
Akira Takahashi が更新

履歴 編集

# `#line`ディレクティブの制約を現実の実装に合わせて緩和する [P4136R2](C++26)

このページはC++26に採用される見込みの言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

## 概要

`#line`ディレクティブは、後続のソース行の行番号を指定する。

    #line 100 "foo.cpp"
    // 以降の行は、ファイル名"foo.cpp"の100行目から始まるものとして扱われる

C++26より前までは、行番号として`0`もしくは`2147483647`より大きい値を指定することが不適格と規定されていたが、これは現実の実装の振る舞いと合致していなかった。

C++26では、`[1, 2147483647]`の範囲外の行番号指定を、不適格ではなく「条件付きサポート (conditionally-supported)」とする。条件付きサポートとは、その指定を実装がサポートするかどうかが実装定義であり、サポートしない場合は診断 (コンパイルエラー) が必要となる、ことを意味する。

    #line 0          // 条件付きサポート (C++26より前では不適格)
    #line 2147483648 // 条件付きサポート (C++26より前では不適格)

現実のコンパイラ実装の動作に合わせ、そのような仕様とする。

## 関連項目

- C++26 プリプロセッサ仕様での「未定義動作」を不適格 (診断不要) に変更
- C++26 モジュール宣言より前での`#line`ディレクティブの使用を許可する

## 参照

- P2843R3 Preprocessing is never undefined
- P4136R2 `#line` is not in line with existing implementation