以前の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++では、数値定数が宣言された位置を検索する場合は、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++で数値定数を宣言する場合は、必ず次の規則に従ってください。
有効な初期化機能が指定された定数宣言で解決できない識別子を使用すると、エラーとみなされます。
次の例は、無効な指定方法とその指定が許可されない理由を示しています。
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 */