名前を付けるという行為には責任が伴います。
子供にせよ、ペットにせよ、変数名にせよ。
ドラクエ5で子供の名前を付ける時に、かなり悩んだ経験を持つ人も多いのではないでしょうか。
そしてC++でコーディングしている時も名前を付ける機会は多いです。
私の人生で、何かに名前を付けるという機会が数多くありましたが、その99.999%はプログラミングしている時でした。
関数名、変数名、マクロ名にクラス名……他にもとにかく名前を付けなければいけないタイミングは多いです。その都度、ドラクエ5の時くらい悩んでいてはプロジェクトは全く進まなくなってしまうので、直感と経験でサクサク名前を付けましょう。
ちなみにここで言及している「名前」のことをC++的に気取っていうと「識別子(Identifiers)」といいます。
この識別子には色々ルールがあって、ルールに違反した識別子は使ってはいけません。
エラーになる識別子
識別子のルールに違反した場合、コンパイラがエラーにしてくれるものがあります。
- 数字から始まる識別子は使えません
- C++キーワードとして登録されている文字列は識別子には使えません
- 一部演算子の代替表現も識別子には使えません
1 2 3 4 5 6 7 8 9 |
#define 256MACRO (1) // 数字から始まるのでエラー namespace 81ns { // 数字から始まるのでエラー } void 123func() { // 数字から始まるのでエラー int 6th; // 数字から始まるのでエラー } |
1 2 3 4 5 |
int while; // whileはキーワードなのでエラー void inline() { // inlineはキーワードなのでエラー } |
一部演算子の代替表現?なんだそれは!?
C++ではキーワードではないが、ある種の演算子と同意語の単語がいくつか用意されており、それらも識別子として使用できません。
例えば && の代替表現は and で、 | の代替表現はbitor です。
Furthermore, the alternative representations shown in Table 5 for certain operators and punctuators (2.6)
are reserved and shall not be used otherwise:Table 5 – Alternative representaions
and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq __n3337 2.12 keywords.
1 2 3 4 5 |
int not_eq; // 演算子の代替表現なのでエラー void and() { // 演算子の代替表現なのでエラー } |
これらのルールはコンパイルの段階でエラーになるので、詳細を覚えててなくても大丈夫です。
エラーにならない識別子
以下のルールはエラーにはなりませんが、C++の予約語のため、使ってはいけません。
- アンダースコアで始まり大文字が続く名前(コード中どこでも禁止)
- アンダースコアが連続する名前(コード中どこでも禁止)
- アンダースコアから始まる名前(グローバル変数のみ禁止)
1 2 3 4 5 6 7 |
int _a; // アンダースコアから始まるグローバル変数はダメ int main() { int i__; // _が連続する場合は先頭からでなくてもダメ int _Japan; // _から始まって次が大文字の場合もダメ return 0; } |
これらのルールに違反した識別子を使った場合の動作保証は無いので、絶対に使わないようにしましょう。例え__Japan_987654321_wwww___ssl93jjasf__なんて識別子が被るなんてあるわけないから別に問題ないじゃん!と思ったとしても、避けられるリスクは避けるべきです。単に言語の規格で使うべからずとされているものは使わない方がいいのです。
特にインクルードガードを書く時にこのルールを犯しているコードをよく見かけます。
1 2 3 4 5 6 |
#ifndef _HOGE_H__ // アンダースコアから始まって大文字なのでダメだしダブルアンダースコアだしダメダメ #define _HOGE_H__ // ヘッダーの内容をつらつらと書く #endif // _HOGE_H__ |
コンパイラがエラーにしてくれないので、書く側で気をつけましょう。
まとめ
- キーワードと同じ名前は識別子にはつけられません
- 記号の代替表現と同じ名前は識別子にはつけられません
- 数字から始まる名前は識別子にはつけられません
- 予約語となっているルールを破る識別子は絶対につけてはいけません
「禁忌の識別子」への1件のフィードバック
コメントは停止中です。