C/400

39. 関数の省略可能なパラメータを定義するには

多くの関数を定義していて関数にあらたなパラメータを定義するとき、
既にこの関数を利用している記述を全部探し出して修正するのは大変である。
新たに追加するパラメータを省略可能なパラメータとして定義すれば
他の記述は修正する必要がない。

Visual C++ ではこのような定義は非常に簡単で、

void Function(char* str, int newprm = 1);

のように 「= 1」のように省略値を定義するだけで、このパラメータ newprm
省略可能なパラメータとして見なされるようになる。
ところが ANSI-C である C/400 では

void Function(char* str, ...);

のようにして「...」によって省略のパラメータであることを宣言するのであるが、
使い方にはちょっとしたコツがある。
この使用方法に関しては Web でもIBM マニュアルでもわかりやすい例での説明が
ほとんど見当たらないので、ここで紹介することにする。

#include <stdarg.h>
/***********************************************************/
int   toASCII(char* ascbuf, char* ebcbuf, char table[10],    
                     char tbllib[10], ...)                   
/***********************************************************/
{       
  va_list arg_ptr; 
  int bSISO = FALSE;                                                     
   :
   va_start(arg_ptr, tbllib);       
   bSISO = va_arg(arg_ptr, int);    
   if(bSISO != TRUE) bSISO = FALSE; 
     :
 }
【 参考 】

パラメータ tbllib には後続として「 ... 」によって省略可能なパラメータが
存在していることを示している。
va_start で直前のパラメータ名 tbllib を使って
va_start(arg_ptr, tbllib) として arg_ptr をセットしてから
bSISO = va_arg(arg_ptr, int); によって省略されていたパラメータである
bSISO を取り出している。
va_start のセットは直前の明示的なパラメータを指定することがコツとなる。
このことはどこにも解説されていない。