C++ 3.0 コンパイラ用に作成したコードを C++ 5.0 コンパイラでコンパイルするには、次の変更が必要です。
C++ 5.0 コンパイラでは、K&R 形式の関数定義を使用することはできません。プロトタイプ形式の関数定義を使用してください。
int f(a) int a; { ... } // C++ 5.0 ではエラー
代入で _new_handler 大域変数を設定することはできません。この目的には、set_new_handler() 関数を呼び出してください。
クラス内に operator new() がない場合は、常に大域の operator new() が使用されます。C++ 3.0 では、誤って、大域のものではなくクラスの外側のものが使用される場合があります。次の例では、C++ 3.0 は、領域の割り当てに、誤って Outer::operator new を使用しています。
class Outer { public: void* operator new(size_t); class Inner { ... // operator new なし }; }; Outer::Inner* p = new Outer::Inner; // どちらの operator new か?
typedef 名を、struct、class、union のタグとして使用することはできません。次に例を示します。
typedef struct { int x; } S; struct S b; // C++ 3.0 では問題なく、C++ 5.0 ではエラー S c; // つねに OK
代わりに、構造体、クラス、共用体でタグを使用してください。上記の例のエラーを解決する最も簡単な方法は、typedef 名をさらにタグとして使用する方法です。この方法は、C でも、C++ でも許されます。
typedef struct S { int x; } S; struct S b; // 常に OK S c; // 常に OK
名前をクラス内で使用した場合、その名前を外側のスコープから定義し直すことはできません。大きな問題になる可能性があるため、C++ 標準では、そうした再定義は許可していません。C++ 3.0 コンパイラでは、そのようなコードを検出しませんでしたが、C++ 5.0 ではエラーになります。次に例を示します。
typedef int T; class C { T iv; // int 型 typedef float T; // T を再定義、C++ 5.0 ではエラー T fv; // float 型 };
このエラーを解決するには、T 定義のいずれかの名前を変更します。
C++ 3.0 コンパイラでは、次の例に示すように、定義されていないパラメータを取る関数へのポインタが、状況によっては、「汎用」の関数へのポインタとして機能してしまうという問題がありました。C++ の規則では、関数へのポインタの型は一致している必要があります。
typedef (*pfp)(int,char); typedef (*ufp)(...); int foo(int,char); pfp p = (ufp)foo; // 3.0 では許されるが、5.0 ではエラー
NULL ポインタ定数でコンマを使った式を使用することはできません。リテラルのゼロは NULL ポインタ定数ですが、(anything,0) というような式 (anything は任意の値を示す) は NULL ポインタ定数ではありません。
int f(); char* g() { return (f(), 0); // 3.0 では問題ないが、5.0 ではエラー // 次のようにするか、 // return (f(), (char*)0); // OK // または次の 2 つの文にする // f(); // return 0; }