web-dev-qa-db-ja.com

変数名のドル記号?

私はこのようないくつかのC++コードに出くわしました:

int $T$S;

最初は、ある種のPHPコードか、間違って貼り付けられたものだと思いましたが、コンパイルと実行はうまくいきました(MSVC2008)。

C++の変数にはどのような文字が有効ですか?他に使用できる奇妙な文字はありますか?

27
Valmond

標準に準拠した唯一の有効な文字は、英数字とアンダースコアです。この規格では、Unicodeがアルファベットと見なすほぼすべてのものが受け入れ可能である必要があります(ただし、単一のコードポイント文字としてのみ)。実際には、実装は拡張機能(つまり、$を受け入れるものもあります)と制限(ほとんどの場合、必要なUnicode文字のすべてを受け入れるわけではありません)を提供します。コードを移植可能にする場合は、記号をアクセント記号のない26文字、大文字または小文字、10桁、および「_」に制限します。

29
James Kanze

検索を行ったところ、これはVCでのみ有効であり、C標準では有効ではないことがわかりました。

Microsoft固有

Microsoft C++識別子の最初の2048文字のみが重要です。ユーザー定義型の名前は、型情報を保持するためにコンパイラーによって「装飾」されます。タイプ情報を含む結果の名前は、2048文字を超えることはできません。 (詳細については、装飾名を参照してください。)装飾識別子の長さに影響を与える可能性のある要因は次のとおりです。

  • 識別子がユーザー定義型のオブジェクトを表すのか、ユーザー定義型から派生した型を表すのか。

  • 識別子が関数を表すのか、関数から派生したタイプを表すのか。

  • 関数への引数の数。

ドル記号はVisual C++でも有効な識別子です。

// dollar_sign_identifier.cpp
struct $Y1$ {
    void $Test$() {}
};

int main() {
    $Y1$ $x$;
    $x$.$Test$();
}

https://msdn.Microsoft.com/en-us/library/partnercenter/565w213d(v = vs.90).aspx
http://msdn.Microsoft.com/en-us/library/565w213d.aspx


編集:gccもこの拡張機能をサポートしています

6.34識別子名のドル記号

GNU Cでは、通常、識別子名にドル記号を使用できます。これは、多くの従来のC実装でそのような識別子が許可されているためです。ただし、識別子のドル記号は、通常、一部のターゲットマシンではサポートされていません。ターゲットアセンブラがそれらを許可しないためです。

http://gcc.gnu.org/onlinedocs/gcc/Dollar-Signs.html#Dollar-Signs

13
phuclv

私の知る限りでは文字(大文字と小)、数字0から9)および_は、標準に従って変数名に有効です(注:変数名は数字で始めることはできません)。

他のすべての文字はコンパイラ拡張である必要があります。

2
iammilind