最終更新日時: 2025年07月10日 10時26分30秒 (JST)
Koichi Murase が更新

履歴 編集

# #warningのサポートを追加 [P2437R1](C++23)

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

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

## 概要

C++23では、プリプロセッサ命令として、特定のコードに到達した際に警告メッセージを出力する `#warning` をサポートする。

    #warning The code is deprecated.

`#warning`命令は`#error`命令とちがい、コンパイルが停止しない。

## 仕様

プリプロセッサ命令の構文として、`#error`と同様の構文で`#warning`が定義される：

    #error pp-tokens(opt) new-line
    #warning pp-tokens(opt) new-line

`#error`は到達時にプログラムが不適格になると規定されるが、`#warning`では不適格にならない。

警告メッセージの扱いは実装定義。

## 例

    #include <iostream>

    #warning The code is deprecated.

    int main()
    {
        std::cout << "Hello" << std::endl;
    }

### 出力例

    prog.cc:3:2: warning: #warning The code is deprecated. [-Wcpp]
        3 | #warning The code is deprecated.
          |  ^~~~~~~
    Hello

## この機能が必要になった背景・経緯

`#warning`はほぼ全ての主要なコンパイラがサポートしており、致命的でない問題をプログラマに知らせたい状況で便利だった。

例として、ライブラリ作者が、自身のライブラリがマルチスレッドをまだサポートしておらずパフォーマンス劣化の懸念があるが、安全に使用することはできる、というようなことをユーザーに知らせたい、という状況で本機能が重宝される。

## 参照

- P2437R1 Support for `#warning`