g ++を使用して64ビットオペレーティングシステムを作成していますが、次のような可変個引数関数があります。
void DbgPrint(const char *fmt, ...);
これはprintfのように動作します。ここでの問題は、g++がSystemV ABIに従うため、RDI、RSI、RDX、RCX、R8、R9の最初の引数を渡し、残り(存在する場合)をスタックにプッシュすることです。
古いstdarg.hマクロva_start、va_argなどをcdeclで使用することは、va_argがスタック上の次の要素を取得するだけなので、すべて非常に簡単でした。しかし、これらのマクロは7番目の引数までまったく機能しません。
考えられる唯一の解決策は(IMHO)です。
- g++にcdecl関数を作成させる。__属性__((cdecl))が意図的かつ明確に無視されているように強調表示されているため、これは不可能のようです。
- 引数を渡す新しい方法で機能する新しいマクロのセットを用意します。
(私は実際にWinに取り組んでいるので、それらの実装をチェックするためのglibcヘッダーがありません)。
解決策を持っている人はいますか?前もって感謝します。