標準で定義される属性のほかに、実装定義の属性がありますが、その実装定義の属性を認識できない他の処理系では、その実装定義の属性は無視されることが規定されます。属性指定の文脈で#ifdef
を書かなくてよくなります。
// GCC/Clangではgnu::deprecated属性が使用され、 // MSVC環境ではmaybe_raises_seh_exception (仮) が使用される [[gnu::deprecated, msvc::maybe_raises_seh_exception]] void f();
仕様としては、「認識できない属性トークンは、実装によって無視される」というものになります。実装ごとに適切な名前空間を用意することが推奨されるため、その処理系の名前空間内では、認識できない属性はコンパイルエラーか警告が出力されることになると考えられます。
参照
- P0283R0 Standard and non-standard attributes
- P0283R1 Standard and non-standard attributes
- P0283R2 Standard and non-standard attributes
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。