C言語関係掲示板

過去ログ

No.313.printfのカバー

[戻る] [ホームページ]

No.1923

printfのカバー
投稿者---Horita(2002/07/03 15:25:26)


printfのような可変引数関数のカバー関数を作りたいのですが。

void myprintf(const char* a, ... )
{
printf( a,???? );
}

こういうことってできますでしょうか?
問題としては、vfprintf等で表示するとかいうことではなく、
受け取った可変引数をそのまま渡したいというところです。


No.1930

Re:printfのカバー
投稿者---kikk(2002/07/03 16:33:08)


ども。


>printfのような可変引数関数のカバー関数を作りたいのですが。

関数ではなくマクロなら、以下のように可変個引数をとるマクロをつかって
実現できます。関数ではたぶんむりです。。

#define myprintf(a) (printf a)

として、使用時に引数をかっこでくくる。

myprintf(("hello, world\n"));
myprintf(("I am %x years old.\n", 32));

いちいちかっこでくくるのがめんどうですけど。

処理系によっては、上記のような不恰好なことをしなくてもすむかも
しれません。また、C99ではより自然に書けるようになったようです。

参考:
http://seclan.dll.jp/c99d/c99d02.htm#dt19990405


では。

No.1935

Re:printfのカバー
投稿者---Horita(2002/07/03 20:45:58)


>関数ではなくマクロなら、以下のように可変個引数をとるマクロをつかって
>実現できます。関数ではたぶんむりです。。

ありがとうございます。
検討してみます。

No.1970

Re:printfのカバー
投稿者---Horita(2002/07/05 14:13:55)


>いちいちかっこでくくるのがめんどうですけど。

書式が少し変わるのでちょっと気にはなりますが、
教えていただいたマクロでいこうと思います。

今後ともよろしくお願いします。

No.1939

Re:printfのカバー
投稿者---Aki(2002/07/03 22:09:43)


>printfのような可変引数関数のカバー関数を作りたいのですが。
>
>void myprintf(const char* a, ... )
>{
> printf( a,???? );
>}
>
>こういうことってできますでしょうか?
>問題としては、vfprintf等で表示するとかいうことではなく、
>受け取った可変引数をそのまま渡したいというところです。

よろしければvfprintf等を使わない理由を教えてください。



こんなのではだめですよね。

#define myprintf    printf



No.1956

Re:printfのカバー
投稿者---Horita(2002/07/04 22:56:16)


>よろしければvfprintf等を使わない理由を教えてください。

可変引数関数の例としてprintfをあげただけです。
実際は、共通部品として可変引数をもつ関数が提供されていて、
これをカバーして使おうと設計したらつまづいてしまったので。

可変引数関数(自前)→可変引数関数

というような構成をとりたかったのです。


No.1962

Re:printfのカバー
投稿者---Aki(2002/07/05 11:02:41)


>>よろしければvfprintf等を使わない理由を教えてください。
>
>可変引数関数の例としてprintfをあげただけです。
>実際は、共通部品として可変引数をもつ関数が提供されていて、
>これをカバーして使おうと設計したらつまづいてしまったので。
>
>可変引数関数(自前)→可変引数関数
>
>というような構成をとりたかったのです 

その共通部品の可変個引数をとる関数をfとすると、

void before_f(void) { /* ... */ }
#define my_f    before_f(), f

とすれば、fの呼び出し前に処理を挿入できます。

>vfprintf等で表示するとかいうことではなく、
vfを定義するという方法はだめなんでしょうか。
その場合、当然fはvfを呼び出すだけの簡単なものに変更します。


No.1965

Re:printfのカバー
投稿者---Horita(2002/07/05 13:45:16)


>その共通部品の可変個引数をとる関数をfとすると、
>
>void before_f(void) { /* ... */ }
>#define my_f before_f(), f
>
>とすれば、fの呼び出し前に処理を挿入できます。

ありがとうございます。
実はbefore_f()ではなく、after_f()みたいな処理をしたいと思ってます。


No.1957

Re:printfのカバー
投稿者---かずま(2002/07/04 23:22:35)


> printfのような可変引数関数のカバー関数を作りたいのですが。

> 問題としては、vfprintf等で表示するとかいうことではなく、
> 受け取った可変引数をそのまま渡したいというところです。

かなりインチキなやり方で、制限もありますが、少なくとも Windows 2000 上で、
gcc, LSI C-86, Borland C++, Visual C++ で動きました。
#include <stdio.h>
#include <stdarg.h>

int my_printf(const char *fmt, ...)
{
    va_list ap;   int i, a[8];

    va_start(ap, fmt);
    for (i = 0; i < 8; i++)
        a[i] = va_arg(ap, int);
    i = printf(fmt, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);
    va_end(ap);
    return i;
}

int main()
{
    my_printf("%d %f %c\n", 123, 3.14, 'A');
    return 0;
}

カバーというよりラッパーと呼ぶほうが私は好きです。

No.1967

Re:printfのカバー
投稿者---Horita(2002/07/05 13:49:18)


> for (i = 0; i < 8; i++)
> a[i] = va_arg(ap, int);
> i = printf(fmt, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);

ありがとうございます。
このやり方で、char*を渡しても平気ですか?