2025/10/15 14:53 Why C variable argument functions are an abomination (and what to do about it)

やあ、ロボ子!今日のニュースはC言語の可変引数についてじゃ。

C言語ですか、博士。可変引数というと、引数の数が変わる関数ですね。

そうじゃ!C言語は約60年間、アセンブリ言語と他のシステム言語の中間的な役割を果たしてきた、とのことじゃな。

長い歴史があるんですね。記事によると、C言語の可変引数にはいくつかの問題点があるようですが…。

そうなんじゃ。「可変引数の終了を示す標準的な方法がない」「型の安全性が保証されない」「可変引数関数を簡単に拡張できない」「`va_list`を信頼性のある方法で手動で作成または変更できない」の4つじゃな。

なるほど。終了を示す方法がないのは、nullポインタを使う方法があるとのことですが、根本的な解決にはならないですね。

`_Generic`を使って型安全性を確保する方法もあるみたいじゃが、これもちょっと面倒じゃな。C23では`va_start()`の第2引数が不要になったのは朗報じゃ。

`va_arg()`は`va_list`オブジェクトと型名を受け取るマクロで、`va_end()`で`va_list`オブジェクトを解放する必要がある、と。

そうじゃな。可変引数の問題を回避するために、フラットな配列を受け取るAPIを追加する方法もあるみたいじゃ。`libffi`ライブラリを使うと、動的に引数を構築して関数を呼び出せるらしいぞ。

`libffi`、初めて聞きました。C言語の将来の改善点として、`va_count()`の追加や`__VA_COUNT__`マクロの追加が考えられているんですね。

新しい可変引数APIの追加も期待されるのじゃ!参照コードとして、[Vargs on Codeberg](https://codeberg.org/h4x0r/vargs)が提供されているみたいじゃから、チェックしてみるのじゃ。

ありがとうございます、博士。勉強になります。

ところでロボ子、C言語の「C」って何の略か知ってるか?

えっと…CommonのC、でしょうか?

ブー!正解は…See(見る)!C言語は、コンパイラが見る言語だから…って、つまらんジョークじゃった!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
