は、これは私のためだけで罰金をコンパイルします。_(単一アンダースコア)は有効なC++変数名ですか? GCC 4.7.2で
int main()
{
int _ = 1;
return 0;
}
は、私は、これは、一般的にコンパイルすることを期待することはできますか?私はanswers about underscores as prefixesを読んだ。しかし、アンダースコアが何か接頭辞を付けていない場合はどうなりますか?
は、これは私のためだけで罰金をコンパイルします。_(単一アンダースコア)は有効なC++変数名ですか? GCC 4.7.2で
int main()
{
int _ = 1;
return 0;
}
は、私は、これは、一般的にコンパイルすることを期待することはできますか?私はanswers about underscores as prefixesを読んだ。しかし、アンダースコアが何か接頭辞を付けていない場合はどうなりますか?
名前(識別子)は、一連の文字と数字で構成されています。 最初の文字は英字である必要があります。アンダースコア(_)は、 となっています。
よりC++プログラミング言語、第4版。
Stroustrup(第3版、セクション4.9.3)によると、識別子は一連の文字と数字で構成されています。最初の文字は文字でなければなりません。アンダースコアは文字と見なされます。
はい、移植性があります。
2秒であなたを倒す! –
また、[C++標準](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf)(2.11)。 – nickie
はい。単一の_
は変数または任意の識別子/名前空間名として受け入れられます!例えば。 google mockがこれを使用します。
Boost.MPLもあります。 http://www.boost.org/doc/libs/1_54_0/libs/mpl/doc/refmanual/placeholders。html –
はい、有効なプレフィックスです。 実行中
#include <iostream>
using namespace std;
int main()
{
char* _ = "Hello World";
cout << _ << endl;
return 0;
}
は「Hello World」を期待どおりに出力します。それは非常に有用な可変名ではありませんが、有効です
コンパイルまたは実行しても、標準準拠または移植性は保証されません。 –
@WayneMcGee:あなたがコンパイルのLOTSにアクセスすることができない限り[逆の場合にはコンパイラで失敗したり成功する可能性がありますが]、またはコンパイラに標準について厳密に要求しない限り[コンパイラのバグに]。 –
はい、_
は、構文要件を満たしているため、有効な識別子です。基本的に、識別子は、アンダースコア、文字または数字であることができる0以上の他の文字が後に続く、アンダースコアまたは文字で構成されます。 (C++ 2011以降、識別子には普遍的な文字名やその他の実装定義文字も含めることができますが、これはあなたの質問には関係ありません)。
しかしあなた自身のコードで使うべきではありません。非常に注意してください。 this answerとして
は、2003 C++標準を引用し、こう述べています。
アンダースコアで始まるそれぞれの名前がグローバル名前空間の名前として使用するために 実装に予約されています。
あなた_
変数は、グローバル名前空間ではありませんので、あなたは、この場合には安全だが、それは、アンダースコアで始まるいかなる識別子を定義しないようにするとよいでしょう。
また、私はGNU gettext(ローカライズされたメッセージをサポートしています)は、それ自身の目的で_
という名前を使用していると思います。 GNU gettextがこれにするのは間違いだったが、それは便利な選択だった。
これは(GNU gettext convention)C++命名規則と競合しませんか?下線付きのグローバル名*先頭*は禁止されています。 – Wolf
@ウルフ:厳密には禁止されていませんが、予約されています。はい、gettextの '_'の使用はCとC++の両方の要件に違反していると思いますが、実際に' _ 'を使用しない限り、実際の問題を引き起こす可能性は低いです。 –
答えは「はい」だが、それはいいと思う。 –