重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

C言語の関数でいつも不思議に思うのですが

printf("%sさんの成績は、%d点です。", name, score);
printf("\n\n");

のように引数が可変な関数を作成したいのですが、どうすればよいでしょうか?
CとC++の両方の書き方が知りたいです。

理解したいの解説している書籍なども探しています。

A 回答 (3件)

>なぜですか?


何故かは人によりけりだと思いますが、
C言語での実装上、引数はスタックに順に並んでいること
になっていますが可変引数とはこれをマクロを使ってポインタ
計算しそれぞれの引数をvoid*型のデータとみなして分解するので
いろんな意味で危険だったりします。
ほかにも、型のサイズなんかによって落とし穴が多い
#特にC++と混ざるとオブジェクトの型やサイズは計算しづらく
#可変引数はその型を知る方法も実装依存になる
ので理解して無理に使うより、そもそも本当に可変で実装しないと
いけないか実装を見直すほうが良いかと。

#実際私は、デバッグ用のログや文字列とかを出力したりするくらいにしか使ったこと無いです。。。
    • good
    • 0

可変長引数は危険ですからねぇ.


特に, コンパイラで型チェックや自動的な型変換ができないのが痛い. printf とか scanf ではまるというのはよくある光景です.
まあ, 「無理に使うのは理解できていないからだ」とは思いますが>#2, 覚えたてだと使いたがるかも.
    • good
    • 0

"C 可変引数"でググった


http://www.geocities.jp/ky_webid/c/057.html

ほかにもいっぱいある。

でも使わない方が良い。

この回答への補足

>でも使わない方が良い。

なぜですか?
以下の理由だからですか?

>va_start>とva_endマクロの呼び出しは忘れないように注意して下さい。忘れると動作がおかしくなり、最悪の場合、プログラムが強制終了します。

補足日時:2007/10/02 01:51
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!