導入
プログラミング中に、特定の記号が入力できない環境に遭遇したことはありますか?あるいは、他人のソースコードを読んでいて、`<%` や `<:` といった見慣れない記号に出会ったことはないでしょうか。これらはC++に古くから存在する「二文字表記(Digraphs)」と呼ばれる仕様です。現代の一般的な開発環境ではあまり目にする機会はありませんが、この仕様を知っておくことは、古いコードベースの保守や、特殊なプリプロセッサ環境下でのトラブルシューティングにおいて非常に重要です。
基礎知識
二文字表記(Digraphs)とは、特定の特殊記号が入力できない環境(歴史的なキーボードレイアウトなど)を救済するために、より一般的な文字の組み合わせで同じ意味を持たせるための代替トークンです。C++規格(ISO/IEC 14882)において定義されており、コンパイラはこれらを標準的な記号と完全に同一のものとして解釈します。
主な二文字表記は以下の通りです。
・ `<:` は `[`
・ `:>` は `]`
・ `<%` は `{`
・ `%>` は `}`
・ `%:` は `#`
・ `%:%:` は `
`
これらはマクロや文字列リテラル内ではなく、ソースコードのトークンとして扱われます。
実装/解決策
実務においてこれらを積極的に利用する場面はほとんどありませんが、テンプレートメタプログラミングなどで記号のネストが深くなりすぎて視認性が悪い場合や、特定の古いシステムとの互換性を保つ際に利用されます。重要なのは「これらが標準仕様の一部である」ということを理解し、コードレビュー等で遭遇した際に「構文エラー」と誤認しないことです。
サンプルプログラム
以下のコードは、二文字表記を使用して配列の定義と初期化を行っています。通常の記号を使用したコードと全く同じ動作をします。
include
int main() {
// 通常は int arr[3] = {1, 2, 3}; と書く箇所を二文字表記で記述
int arr<:3:> = <%1, 2, 3%>;
// 標準出力で確認
for (int i = 0; i < 3; ++i) {
std::cout << "要素 " << i << ": " << arr<:i:> << std::endl;
}
// %: はプリプロセッサの # と等価
%:include
return 0;
}
応用・注意点
実務上の注意点として、「コードの可読性」が挙げられます。二文字表記は現代のC++開発において一般的ではないため、これを使用すると他の開発者がコードを理解する際の大きな障壁となります。
また、以下の点に注意してください。
1. 文字列リテラル内は対象外: 例えば `std::string s = “<%";` と書いた場合、これは `{` に置き換えられず、そのまま文字列として扱われます。
2. チームのコーディング規約: 多くのプロジェクトでは二文字表記の使用を禁止しています。もし古いコードを修正する際にこれらを見つけたら、可能であれば現代的な記号(`[]` や `{}`)にリファクタリングすることをお勧めします。
3. コンパイラの挙動: 基本的にどの主要コンパイラでもサポートされていますが、極めて特殊な組み込み環境用のコンパイラでは、オプション設定により無効化されている場合もあります。
二文字表記はC++の歴史的な側面を垣間見ることができる興味深い仕様です。実務では「見かけた時に慌てないための知識」として引き出しに入れておきましょう。

コメント