| ||||||||
| ||||||||
|
不定長の引数をとる関数を作ることができます。
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