私は関数ポインタが呼び出されるコードを書いています。私がしたいのは、この関数呼び出しをして何かを行い、同じ引数でanother関数呼び出しを呼び出すことです。私がターゲットとしている各アーキテクチャのアセンブリを書く必要なく、これを行うための方法があるのだろうかと思います。おそらく、いくつかのGCCのトリックがありますか?C - アーキテクチャに依存しない関数呼び出しの介入
例として、私は私の関数ポインタを呼び出すと、これはかなり簡単ですアセンブリで
foo (/*arguments*/) {
do_something...
bar(/*same arguments*/);
}
を起動します。少なくともx86では、私のスタックポインタが私のスタックフレームの先頭にリセットされていることを確認し、ファンクションバー(コールしない)にジャンプします。
EDIT:おそらく例が不明です。ユーザーはfunction barを呼び出すことを期待していますが、代わりに関数fooにリダイレクトしました(私は引数barがどのようなものか分かりません)。渡されたのと同じ引数でbarを呼び出す前に、fooで何かしたい。このようにして、私がfooでやっていることは、barと呼んでいると思うユーザーには分かりません。
可変機能はオプションですか? –
どのように役立つか分かりませんが、私は引数をva_listにラップできますが、送信する前にそれらをアンラップする必要があります。そうでなければ、別の引数がレイアウトされます。 – dschatz
GCCはテールコールを行います。 'return bar(same args)'を書くと 'jmp'で終わります。より少ない引数があってもそれができると確信しています。したがって、あなたは 'bar()'を返すことができ、あなたのargsが邪魔されないことを信頼することができます。私は船積み製品のために頼りにしたいと思っているものではありません... –