Powiel możliwe:
Casting a function pointer to another typeCzy przekazuje dodatkowe parametry za pomocą wskaźnika funkcji legal/zdefiniowanego w C?
Załóżmy zainicjować wskaźnik funkcji z funkcją, która faktycznie zajmuje mniej parametrów następnie definicji wskaźnik funkcji, będzie funkcja nadal działać prawidłowo, jeśli wywołana poprzez wskaźnik funkcji?
Próbowałem to z gcc i działał zgodnie z oczekiwaniami, ale zastanawiam się, czy to zachowanie jest spójne kompilatory/platform (i podejrzewam w niektórych środowiskach może siać spustoszenie na stosie):
#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);
}
Może również ulec awarii, jeśli używane jest czyszczenie odświeżania. –
Rozumiem. A co z definiowaniem typu wskaźnika funkcji bez listy parametrów, na przykład'typedef void (* myfun)() '. Czy w takim przypadku kompilator powinien zagwarantować, że kolejność parametrów na stosie będzie "właściwa"? – Askaga
@BillAskaga Nie: "aby zagwarantować", co chcesz, być może musisz upewnić się, że funkcja target i wskaźnik funkcji używają konwencji wywoływania cdecl (http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl). – ChrisW