互換性が問題になるのは次のようなケースです。
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では見えない。旧式の
規格だと文句をいってくれます。
