C++識別子におけるアンダースコアの使用ルールとは?避けるべき命名パターンを解説
C++で変数名や関数名などの識別子を定義する際、アンダースコア(_)の使い方には言語仕様上のルールが存在します。一見自由に使えるように見えるアンダースコアですが、特定のパターンはコンパイラや標準ライブラリの実装のために予約されており、ユーザーコードで使用すると予期しない衝突や未定義動作を引き起こす可能性があります。
本記事では、MSDNのドキュメントに基づき、C++識別子におけるアンダースコアの使用ルールをわかりやすく解説します。
MSDNドキュメントに記載された公式ルール
MSDNのドキュメントでは、以下のように規定されています。
識別子の先頭に連続する2つのアンダースコア文字(__)を使用する場合、または先頭の1つのアンダースコアの直後に大文字が続く場合は、すべてのスコープにおいてC++実装のために予約されています。また、先頭の1つのアンダースコアに小文字が続く名前は、ファイルスコープでの使用を避けるべきです。これは、現在または将来の予約済み識別子と競合する可能性があるためです。
絶対に避けるべき名前
上記のルールに基づくと、以下のような名前はどのスコープでも使用してはいけません。
__foo __FOO _FOO
__foo… 先頭に連続する2つのアンダースコアが使われているためNG__FOO… 同様に先頭の二重アンダースコアがNG_FOO… 先頭のアンダースコアの直後に大文字が続いているためNG
これらのパターンは、コンパイラの内部関数や標準ライブラリの実装詳細として使われることが多く、名前が衝突するとコンパイルエラーや動作不良の原因になります。
グローバル名前空間で避けるべき名前
次のような「先頭にアンダースコア+小文字」のパターンは、グローバル名前空間(ファイルスコープ)では使用しないでください。
_foo _bar
ローカルスコープ(関数内など)であれば問題ない場合もありますが、グローバルレベルで定義すると標準ライブラリの内部識別子と競合するリスクがあります。特に移植性を重視するコードでは、このパターン自体を避けるのが安全です。
その他の予約済みプレフィックス・サフィックス
アンダースコア以外にも、以下のような接頭辞(プレフィックス)や接尾辞(サフィックス)は実装のために予約されています。
- LC_ で始まる名前 … ロケール関連の識別子として予約
- SIG_ で始まる名前 … シグナル処理関連のマクロとして予約
- _t で終わる名前 … POSIX規格で型名として予約されているため注意が必要
これらも独自の識別子には使わず、標準ライブラリ側に譲るべき名前です。
安全にアンダースコアを使う方法
一方で、以下のような使い方であれば問題ありません。
- 名前の途中にアンダースコアを含める(例:
my_variable、get_value) - 名前の末尾をアンダースコアにする(例:
count_)
特にメンバ変数の末尾にアンダースコアを付ける命名規則(例:data_)は、Google C++スタイルガイドなどでも採用されている一般的な慣習であり、安全性の面でも推奨されています。
まとめ
| パターン | 例 | 可否 |
|---|---|---|
| 先頭に二重アンダースコア | __foo | 不可(全スコープ) |
| 先頭アンダースコア+大文字 | _FOO | 不可(全スコープ) |
| 先頭アンダースコア+小文字 | _foo | グローバル名前空間では不可 |
| 名前の途中・末尾のアンダースコア | my_var / var_ | 可 |
アンダースコアを活用した命名はコードの可読性を高めますが、「先頭に付ける」際は必ず上記のルールを意識しましょう。予約済み識別子との衝突を避けることで、移植性が高くトラブルの少ないC++コードを書くことができます。
-
ネットワークセキュリティの基本ルールとは?基礎知識をわかりやすく解説
ネットワークセキュリティの基本とは?ネットワークやサーバーへのアクセス権を安易に付与しないことが大前提です。ネットワークへアクセスできる対象を最小限に絞り込み、パスワードに関するベストプラクティスを確実に守りましょう。また、機器やサーバーは安全な環境に設置し、セキュリティ対策を常に最新の状態に保つことが重要です。加えて、ネットワーク上のアプリケーションのトラブルシューティング手法や、ハードウェアを扱うためのツールについても理解しておくと安心です。ネットワークセキュリティの4つの種類ネットワークセキュリティは、主に以下のような要素で構成されます。システムへのアクセス権限管理アンチウイルス・アンチ
-
JavaScriptのeval()関数とは?基本的な使い方と危険性について解説
eval()関数とはJavaScriptのeval()関数は、引数として渡された文字列を評価し、それをJavaScriptコードとして実行するための関数です。文字列で記述された式や関数呼び出しを、その場で動的に処理できるのが特徴です。ただし、eval()の使用は非常に危険であることに注意が必要です。外部からの入力値をそのままeval()に渡してしまうと、悪意のあるコード(XSS攻撃など)を実行されてしまう可能性があります。そのため、実際の開発ではeval()の使用は避け、代替手段を検討することが推奨されています。eval()関数の使用例以下は、JavaScriptでeval()関数を使用するサ