プライマリ・コンテンツに移動
Pro*C/C++プログラマーズ・ガイド
12c リリース1(12.1)
B71397-03
目次へ移動
目次
索引へ移動
索引

前
次

数値定数の評価

以前のPro*C/C++では、ホスト変数(charまたはVARCHARなど)のサイズの宣言時に使用できるのは、数値リテラルや数値リテラルを含む単純な定数式のみでした。次に例を示します。

   #define LENGTH 10
   VARCHAR v[LENGTH];
   char c[LENGTH + 1];

現在は、次のような数値定数の宣言も使用できます。

   const int length = 10;
   VARCHAR v[length];
   char c[length + 1];

このような定数宣言をサポートするANSIコンパイラやC++コンパイラを使用しているプログラマにとって、この機能は最適です。

従来のPro*C/C++では、評価可能な定数式の値の評価は常に実行されてきましたが、数値定数はどのような定数式にも宣言できませんでした。

Pro*C/C++では、マクロが数値リテラルに展開されていれば、通常の数値リテラルやマクロを使用する位置であれば、任意の位置で数値定数を宣言できます。

これは主に、SQL文で使用するバインド変数の配列のサイズを宣言する場合に使用されます。

Pro*C/C++での数値定数

Pro*C/C++では、数値定数が宣言された位置を検索する場合は、C言語の標準のスコープ規則が使用されます。

     const int g = 30;     /* Global declaration to both function_1()
                                                  and function_2() */
     void function_1()
     {
       const int a = 10;  /* Local declaration only to function_1() */
       char x[a];
       exec sql select ename into :x from emp where job = 'PRESIDENT';
     }

     void function_2()
     {
       const int a = 20;  /* Local declaration only to function_2() */
       VARCHAR v[a];
       exec sql select ename into :v from emp where job = 'PRESIDENT';
     }

     void main()
     {
       char m[g];                                   /* The global g */
       exec sql select ename into :m from emp where job = 'PRESIDENT';
     }

数値定数の規則および例

特定の静的な型を持つ変数は、staticで定義し、初期化する必要があります。Pro*C/C++で数値定数を宣言する場合は、必ず次の規則に従ってください。

  • 定数の宣言時にconst修飾子を指定します。

  • 定数の値の初期化時に初期化機能を使用します。この初期化機能は、プリコンパイル時に評価可能である必要があります。

有効な初期化機能が指定された定数宣言で解決できない識別子を使用すると、エラーとみなされます。

次の例は、無効な指定方法とその指定が許可されない理由を示しています。

int a;
int b = 10;
volatile c;
volatile d = 10;
const e;
const f = b;

VARCHAR v1[a]; /* No const qualifier, missing initializer */
VARCHAR v2[b];                      /* No const qualifier */
VARCHAR v3[c];     /* Not a constant, missing initializer */
VARCHAR v4[d];                          /* Not a constant */
VARCHAR v5[e];                     /* Missing initializer */
VARCHAR v6[f];   /* Bad initializer.. b is not a constant */