int ConsolePrint;
void dprintf(const char *arg, ...)
{
if (ConsolePrint)
{
printf(arg);
}
else
{
fprintf(stderr, arg);
}
}
上記の関数を、
dprintf( ”data=[%d]¥n”,10);
で呼び出します。ConsolePrintの値で処理を分けます。
printf の場合は、2つとも引数が渡り、結果の表示は、
data=[10]
となるのですが、
fprintf の場合は、2つめの引数がきちんと渡らず、
data=[1]
等となったりします。
fprintf に可変数の引数を渡すにはどうやればよいのでしょうか?
本当は syslog を使いたいのですが、比較しやすいように fprintf を使いました。
http://www.die.net/doc/linux/man/man3/fprintf.3.html
fprintf(3): formatted output conversion - Linux man page
vprintf, vfprintfを使ってみました。環境はgcc+x86Linuxです。
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int ConsolePrint;
void dprintf( const char *arg, ...)
{
char* p;
va_list ap;
va_start( ap, arg );
if (ConsolePrint){
vprintf( arg, ap );
}
else{
vfprintf( stderr, arg, ap );
}
va_end( ap );
}
main( const int argc, char** argv )
{
ConsolePrint = 1;
dprintf(” data = [%d]¥n”, 10 );
ConsolePrint = 0;
dprintf(” data = [%d]¥n”, 10 );
}
http://www.kouno.jp/home/c_faq/
Language C FAQ
C FAQ 15.5参照
その作り方だとprintf の場合は「たまたま」上手く動いているように見えているだけで、別のコンパイラ、環境では動かない可能性があります。
int ConsolePrint;
void dprintf(const char *arg, ...)
{
va_list ap;
va_start(ap, arg);
if(ConsolePrint) {
vprintf(arg, ap)
} else {
vfprintf(stderr, arg, ap);
}
va_end(ap);
}
ありがとうございます。
なんと、たまたまだったんですか(^^;
質問して良かったです。
http://mitsu.air-nifty.com/blog/2005/01/
みつろぐ: 2005年1月
この場合は、va_listを使いましょう
vsprintfで一度展開してやるといいかもしれません
次のようなソースでやりたいことができます
#include <stdarg.h>
#include <stdio.h>
int ConsolePrint;
void dprintf(const char *arg, ...)
{
char sctmp[4096];
va_list ap;
va_start(ap,arg);
vsprintf(sctmp,arg,ap);
va_end(ap);
if (ConsolePrint)
{
printf("%s",sctmp);
}
else
{
fprintf(stderr,"%s",sctmp);
}
}
int main(int argc, char* argv[])
{
int a;
ConsolePrint=0;
dprintf("data=[%d]¥n",10);
ConsolePrint=1;
dprintf("data=[%d]¥n",10);
return 0;
}
皆さんありがとうございました。
勉強になりました。
syslogの方も、vsyslogで動作しました。
なるほど、別の関数を使うのですか。
vprintfでできるんですね。
と言う事は、syslogの場合は、vsyslogと言うのがあるのでこれでいけるのかな。