既に表題の件のみについて言及するなら片がついた話だとは思いますが、蛇足ながらちょっと書き込ませて頂きます。
・デフォルト引数
C++からDLLにするときに機械語にコンパイルされますが、そもそも機械語のレベルで引数の数は取得する手段がないため、既に結論でてますが不可能です。
どうしても引数の数が欲しい場合、”引数の数”(もしくはそれに準ずるもの)を引数として渡すのが通例です。
(可変長引数の代表格であるprintfも、最初の文字列型引数中に存在する”%付き文字”から引数の数が分かる構造になっています)
機械語レベルでは処理する関数側は”引数は既に決まった数が積まれているもの”として処理するからで、C++側の機能はご推察の通り、”この関数で引数が足りなかった場合、デフォルト引数があったら自動でそれを付け足して呼び出したことにする”だけだったりします。
つまりはコンパイラが自動でしてくれるただの置き換え操作なので、完全に蛇足ですが突き詰めるとこういう関数も作れます。
#include <cstdlib>
// 引数なしで呼ぶと乱数を返し、引数ありで呼ぶと引数を返す
int a( int f = rand() )
{
return f;
}
こういうグローバルに副作用を伴う関数がデフォルト引数に刺さっていることはまず有り得ないですが、原理的にこういうことも出来るんですよ、程度の小咄に。
・置き換え
さて、HSPには関数のデフォルト引数はないのでガッカリしつつ、単なる置き換えという言葉から何か出来ないかと探すと、HSPではちょうど#defineというのが存在します。
で、なんとHSPの#defineにはデフォルト引数というのが存在します、関数にはないのに。
そして今回のやりとりを見る限り、あくまでC++の関数をHSPから使いたいという要望であればこの機能が必要十分に機能するように思います、サンプルスクリプトで示すと…
#cfunc add "add" int, int
#define ctype add_default(%1, %2 =5) add((%1), (%2))
add_default(3)
としてみるとうまくいくんじゃないでしょうか。
デフォルト引数の定義箇所がC++ではなくHSPに移ってきてしまいましたが、処理する次元から考えればこっちの方が私には自然に思えます。