Eventuali duplicati:
Casting a function pointer to another typePassa parametri aggiuntivi tramite il puntatore di funzione legale/definito in C?
assumere i inizializzare un puntatore di funzione con una funzione che prende effettivamente meno parametri quindi la definizione puntatore a funzione, sarà la funzione comunque eseguire correttamente se chiamato attraverso la puntatore di funzione?
Ho provato questo con gcc e ha funzionato come previsto, ma mi chiedo se questo comportamento è coerente tra compilatori/piattaforme (temo che in alcuni ambienti potrebbe devastare sullo stack):
#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);
}
Si può anche arrestare in modo anomalo se viene utilizzata la pulizia del callee. –
Vedo. Che ne dici di definire il tipo di puntatore della funzione senza lista parametri, come'typedef void (* myfun)() '. Il compilatore dovrebbe garantire che l'ordine dei parametri sullo stack sia "giusto" in quel caso? – Askaga
@BillAskaga No: per "garantire" ciò che si desidera, è necessario assicurarsi che la funzione di destinazione e il puntatore della funzione utilizzino entrambi [convenzione chiamata cdecl] (http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl). – ChrisW