The BAQ/Memo/Linux C/関数で不定長の引数

Japanese English
Nuclear Physics Data Acquisition Orchestra Gallery Memo Diary Link Home
Linux C Fortran Postscript Home

もどる

不定長の引数をとる関数を作ることができます。
printfで色などにあるように、 printfで色が表示できますが、いちいちコードを書くのが面倒なので、 printfをオーバーラップする関数を作る時に役立ちます。
詳しくは'man stdarg'を参照。

色など付きprintf

bbcpri.c

#include <stdio.h>
#include <stdarg.h>

int bbcpri_code[20] =
{1,4,5,7,30,31,32,33,34,35,36,37,40,41,42,43,44,45,46,47};

void cprintf(int att,char *fmt,...){
   int bbcpri_i;
   va_list argp;

   va_start(argp,fmt);
   for(bbcpri_i=0;bbcpri_i<30;bbcpri_i++){
     if((att & 0x01)){
       printf("\x1b[%dm",bbcpri_code[bbcpri_i]);
     }
   att = att>>1;
   }
   vprintf(fmt,argp);
   va_end(argp);
   printf("\x1b[00m");
}

まずは2行目で'stdarg.h'をインクルードします。

9行目の'va_list argp'で不定長の引数リストを宣言されます。

11行目の'va_start(argp,fmt)'は不定長の引数が'fmt' の次からですよということを宣言します。
これをしておかないと、不定長の引数リストargpが有効になりません

18行目の'vprintf(fmt,argp)'は本質的にprintfと同等で、不定長の引数を使うかわりに、va_listを使います。

19行目の'va_end(argp)'は引数リストを終了するときの約束ごとです。

ここでは使っていませんが、'type va_arg(va_list ap, type)'というマクロもあります。

  void fun(int len,....){
  va_list argp;
  int i,b;

  va_start(argp,a);

  for(i=0;i<len;i++){
    b = va_arg(argp,int);
    printf("%d\n",b);
  }
}

のように使います。
'va_arg'を呼び出すごとに順次引数の値を返します。
しかし、引数の型や終りを識別することができません。
なので、上記の例では不定長と言ってもint型に引数を決めておいて、さらに'int len'で引数の数を指定しています。


色など付きprintfを使ってみる

上記のファイルをダウンロードします。

とすると、赤太文字下線付きの文字が表示されるはずです。
'cprintf(int att,const char *format, ...)'が関数で、 attに色や装飾を指定します。その後の引数はprintfと同様です。
例えば、青太文字で背景を赤にしたい場合は、attに'AT_BOLD|FG_BLUE|BG_RED' を指定します。
色や装飾は'bbcpri.hを見て下さい。

Last Update: 2005/3/4
Hidetada Baba
baba rarfaxp.riken.jp