可能性の重複:を介して呼び出された場合に
Casting a function pointer to another typeCで定義されている関数ポインタ/法律で追加のパラメータを渡していますか?
は、機能は正常に実行されます、私は実際には、関数ポインタの定義を以下のパラメータを取る関数と関数ポインタを初期化すると仮定関数ポインタ?
私はgccでこれを試してみましたが、期待どおりに働いたが、その振る舞いはコンパイラ/プラットフォーム(私はそれがスタック上に大混乱をもたらすかもしれないいくつかのenviromentsに疑いがある)全体で一貫しているのだろうか:
#include <stdio.h>
typedef void (*myfun)(int, int, int);
void test_a(int x, int y, int z) {
printf("test_a %d %d %d\n", x, y, z);
}
void test_b(int x, int y) {
printf("test_b %d %d\n", x, y);
}
int main() {
myfun fp;
fp = test_a;
fp(1, 2, 3);
fp = (myfun) test_b;
fp(4, 5, 6);
}
また、着信音のクリーンアップを使用するとクラッシュすることがあります。 –
私は参照してください。 'typedef void(* myfun)() 'のように、パラメータリストなしで関数ポインタ型を定義するのはどうでしょうか?その場合、スタック上のパラメータの順序が「正しい」ことをコンパイラが保証するはずですか? – Askaga
@BillAskaga No:あなたが望むものを「保証」するには、ターゲット関数と関数ポインタの両方が[cdecl呼び出し規則]を使用するようにする必要があります(http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl )。 – ChrisW