オープンソースの C++ コードを調べていたところ、主に変数名の先頭で、コード内で二重のアンダースコアが多数使用されていることに気付きました。
return __CYGWIN__;
疑問に思っているのは、これには理由があるのでしょうか、それとも一部の人々のコードスタイルだけなのでしょうか? 読みづらくなってしまうと思います。
識別子での 2 つのアンダースコア (`__') の使用は、ANSI-C 標準に従って、コンパイラの内部使用のために予約されています。
アンダースコア (`_') は、ライブラリ関数 ("_main" や "_exit" など) の名前でよく使用されます。衝突を避けるために、識別子をアンダースコアで始めないでください。
彼らが「実装の一部」、つまり標準ライブラリであると感じない限り、そうすべきではありません。
ルールはかなり具体的で、他の人が提案したよりも少し詳細です。
2 つのアンダースコアを含むか、アンダースコアで始まり、その後に大文字が続くすべての識別子は、すべてのスコープで実装を使用するために予約されています。つまり、それらはマクロに使用される可能性があります。
さらに、アンダースコアで始まる (つまり、別のアンダースコアまたは大文字が続かない) 他のすべての識別子は、グローバル スコープでの実装用に予約されています。これは、これらの識別子を独自の名前空間またはクラス定義で使用できることを意味します。
これが、Microsoft が、C++ 標準の一部ではない多くのコア ランタイム ライブラリ関数に対して、先頭にアンダースコアを付け、すべて小文字で関数名を使用する理由です。これらの関数名は、標準 C++ 関数またはユーザー コード関数と衝突しないことが保証されています。
C++ 標準によると、1 つのアンダースコアで始まる識別子はライブラリ用に予約されています。2 つのアンダースコアで始まる識別子は、コンパイラ ベンダー用に予約されています。
前述のコメントは正しいです。 __Symbol__
は一般に、有益なコンパイラ (またはプリプロセッサ) ベンダーから提供されるマジック トークンです。これらの中でおそらく最も広く使用されているのは__FILE__
と__LINE__
で、現在のファイル名と行番号を示すために C プリプロセッサによって展開されます。これは、エラーのテキストの場所を含む、ある種のプログラム アサーション エラーをログに記録する場合に便利です。
これは、「通常の」コードでは行うべきではないことです。これにより、コンパイラとシステム ライブラリが、ユーザーのシンボルと衝突しないシンボルを定義できるようになります。
他の多くの人が回答したライブラリに加えて、プリプロセッサで使用するマクロや #define 値に名前を付ける人もいます。これにより、作業が容易になり、古いコンパイラのバグを回避できた可能性があります。
他の人が述べたように、名前の衝突を防ぎ、ライブラリ変数と独自の変数を区別するのに役立ちます。