web-dev-qa-db-ja.com

一般的な(ビルド)システムでのC / C ++識別子の最大長はいくつですか?

識別子の最大長の一部を言っている標準を覚えていないので、理論的にはlongになる可能性があります。実際には、これらの名前は少なくともコンパイラとリンカの実装によって制限される可能性があります。

これはすべてのシステムで機能するはずですが

int a;

このスニペット

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

コンパイル/リンク(gcc/mingwを使用)中に、ldを使用したstd::somethingsへの未定義の参照を提供する宣言を作成します。

では、さまざまなシステムでの識別子のサイズ制限は何ですか?

31
mbx
43
Anders Lindahl

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

15

MISRA C 2004に基づく:

ルール5.1(必須):識別子(内部および外部)は、31文字を超える意味に依存してはなりません。 [未定義7;実装5、6] ISO標準では、コードの移植性を保証するために、最初の31文字が内部識別子であることを要求しています。コンパイラがサポートしている場合でも、この制限を超えることはできません。この規則は、すべての名前空間に適用されます。マクロ名も含まれ、31文字の制限は置換の前後に適用されます。 ISO標準では、最適な移植性を保証するために、大文字と小文字に関係なく、最初の6文字で外部識別子を区別する必要があります。ただし、この制限は特に厳しく、不要と見なされます。この規則の意図は、ISO要件の緩和を現代の環境に見合った程度に認可することであり、31文字/ケースの重要性が実装によってサポートされることを確認する必要があります。特に識別子名が長い場合は、1文字または数文字だけ異なる識別子名の使用に関連する問題があることに注意してください。 1(1)とl(小文字のL)、0とO、2とZ、5とS、またはnとhのような読み違いの多い文字に違いがある場合、問題はさらに大きくなります。識別子名は常に視覚的に簡単に区別できるようにすることをお勧めします。この問題に関する特定のガイドラインをスタイルガイドラインに含めることができます(セクション4.2.2を参照)。

このルールを使用します。たぶん誰かが「31を超える識別子を認識できないコンパイラを見つけましたか?」はい、IAR RL78 v2.21.1で覚えています。警告とエラーなしで2つの識別子を定義しました。アクセスで問題が発生しました(正確なシナリオは覚えていません)

0
SpongeBob