Rational Developer for System z
Enterprise PL/I for z/OS, Version 3.8, コンパイラーおよびランタイム 移行ガイド

初期化されていない EXTERNAL STATIC

従来のコンパイラーでは、EXTERNAL STATIC と宣言されたのに INITIAL 値の指定がない変数は、 ストレージを割り振られることはありませんでした (そしてタイプ CM のリンケージ・エディター ESD が 発行されました)。 その変数のストレージは、リンクしている他のプログラム・オブジェクトで定義する必要がありました。 事実、実際に割り振られるストレージは、宣言で指定する (または暗黙に指定する) ものよりも大きい可能性もありました。 例えば、次のコード宣言を見てみましょう。

dcl testpcl ext static, pcl char(16) based(addr(testpcl));

変数 testpcl は (暗黙の) FLOAT DEC(6) 属性を持ち、 そのため 4 バイトのストレージのみを割り振られるかのように見えます。 このプログラムとリンクするすべてのプログラムが 同じ PL/I 宣言で testpcl を宣言した場合、4 バイトが割り振られます。 しかし、それが例えば testpcl を 16 バイトの CSECT として定義するアセンブラー とリンクされていた場合、 リンカーはその変数に 16 バイトを割り振ります。

新しいコンパイラーは現在、そのような変数に 4 バイトを割り振ります (そして、タイプ SD で長さ 4 のリンケージ・エディター ESD を発行します)。 その変数を例えば 16 バイト領域のベースとして 使おうとすると、エラーになります。

変数を宣言し、そのストレージ割り振りを他のモジュール内の宣言によって決定する 場合は、RESERVED オプションを使用して宣言してください。 例えば、上の宣言は次のようになります。

dcl testpcl ext static reserved, pcl char(16) based(addr(testpcl));

ただし、オプション COMMON を指定して コンパイルした場合、Enterprise コンパイラーはタイプ CM のリンケージ・エディター ESD も発行し、そのコードは旧コンパイラーと同じ動作を行います。


Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)