互換性が問題になるのは次のようなケースです。
declarator: ... declarator [ constant-expressionopt ]とあります。ところが、g++では「定数表現」であるべきところに 任意の表現を持ってくることができます。
int j = 100; int a[ j ];これは例えばSPARCompiler(CC)ではエラーになりますがg++ではOKです。正しくは
const int j = 100; int a[ j ];です。また、関数の仮引数の場合は
void func( int j ) { int a[ j ]; }この場合はg++ではOKですが、CCではだめです。また、
void func( const int j ) { int a[ j ]; }はCCでは許されません。
では、互換性を保つコーディングはどうあるべきでしょうか。同じARMで
new-declarator: ... new-declaratoropt [ expression ]となっています。newの中なら任意の表現が許されることになります。上の例は
void func( const int j ) { int * a = new int[ j ]; }とする必要があります。実際のaの使い方は配列要素取り出し演算子[]を 使って同じように扱えます。deleteが必要になるところが違いますが。
for( int i = 0; i < 100; i ++ ) { /*...*/ } for( int i = 0; i < 100; i ++ ) { /*...*/ }これは例えばC++ではiが二度宣言されているというエラーになりますが、 g++では正しいと扱われます。iはANSIでは{}の中で定義されているように 扱いますが、古いCCでは{}の外、forの置かれたレベルで定義されたと 考えます。そのためにこのような結果になります。逆に
for( int i = 0; i < 100; i ++ ) { /*...*/ } for( i = 0; i < 100; i ++ ) { /*...*/ }この場合、CCでは問題なく通りますが、g++ではスコープルールからiは 最初のforの{}の中に定義されているので次のforでは見えない。旧式の 規格だと文句をいってくれます。