人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C言語で、関数の可変引数について教えてください。(環境:SH4用Linux)

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 を使いました。

●質問者: GigaSlave
●カテゴリ:コンピュータ
✍キーワード:Char const Linux syslog void
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● くまっぷす
●20ポイント

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 );

}

◎質問者からの返答

なるほど、別の関数を使うのですか。

vprintfでできるんですね。

と言う事は、syslogの場合は、vsyslogと言うのがあるのでこれでいけるのかな。


2 ● dev_zer0
●20ポイント

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);

}

◎質問者からの返答

ありがとうございます。

なんと、たまたまだったんですか(^^;

質問して良かったです。


3 ● aki73ix
●20ポイント

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で動作しました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ