2011-05-15 6 views
25

識別子の最大長を表す標準を覚えていないので、理論的にはの長さはです。実生活では、これらの名前は少なくともコンパイラとリンカーの実装によって制限される可能性があります。共通(ビルド)システム上のC/C++識別子の最大長はどれくらいですか?

これは、すべてのシステム

int a; 

このスニペット

#!/usr/bin/perl 
print "int" . "b" x 2**16 . ";"; 

に取り組むべきである一方では(GCC/mingwのを使用して)リンク/コンパイル中ldstd::代に未定義の参照を与えるdeclarationenを作成します。

異なるシステム上の識別子のサイズ制限はいくらですか?

+1

は、名前の長さ制限は*マングルされた名前*のためのものであることを注意してください。私は、テンプレート関数を書いて、いくつかの 'boost :: transform_iterator 'を渡すと、MSVCからのいくつかの厄介な警告によって多くの時間を暴かれました。インスタンス化の難解な名前はちょっと狂ったように長くなります。 –

+0

@Alexandre:今まで私はその問題を抱えていませんでした。私が覚えているテンプレートに関連する唯一の問題は、メタプログラミングを使ったいくつかのプロジェクトでテンプレートの深さを増やさなければならないということでした。 – mbx

+0

gccにはこのような問題はありません(@Andersの回答を参照)。これは、混乱した名前が2048文字を超える場合、MSツールでときどき起こるという警告のみです。しかし、通常はあなたのビルドに大きな影響を与えません。 –

答えて

12

C++標準の付録Bでは、実装で少なくとも1024文字の識別子をサポートする必要がありますが、これは必須ではありません。

+2

メモリが私の右に役立つならば、注意深く1単語、この長さは、マングルされたシンボルを識別します。テンプレートクラスを引数として取る関数は、かなり毛深い名前を持つので、これまでにフェッチされた制限はありません。 –

+0

@Matthieu明らかにそうではありません。実際、私が知っている限り、この規格では名前のマングリングについては言及していません。 –

+0

@ Neeil:私はそうではないと思います。各コンパイラは独自のABIを開発しているかもしれません(あるいは誰かの他のものを再利用する場合は、実際に生成されたコードが互換性があることを確認してください)。私は、標準でツールチェーンの長さを指定しているという事実を明らかにしたかったのですが、これはリンカーに表示されている長さとは異なります。 –

関連する問題