• ベストアンサー

引数の数が可変な関数

C言語の関数でいつも不思議に思うのですが printf("%sさんの成績は、%d点です。", name, score); printf("\n\n"); のように引数が可変な関数を作成したいのですが、どうすればよいでしょうか? CとC++の両方の書き方が知りたいです。 理解したいの解説している書籍なども探しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

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

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

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

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

"C 可変引数"でググった http://www.geocities.jp/ky_webid/c/057.html ほかにもいっぱいある。 でも使わない方が良い。

tobasu
質問者

補足

>でも使わない方が良い。 なぜですか? 以下の理由だからですか? >va_start>とva_endマクロの呼び出しは忘れないように注意して下さい。忘れると動作がおかしくなり、最悪の場合、プログラムが強制終了します。

関連するQ&A