Ich habe schon seit geraumer Zeit die folgende Funktion wurde unter Verwendung von:Variadische Funktion arbeitet in Win32 aber nicht in Win64
void AddRow(int iNumOfColumns,...)
{
int* pValuePerColumn = (int*)&iNumOfColumns+1;
for (int i=0; i<iNumOfColumns; i++)
{
// Do something with pValuePerColumn[i]
}
}
Jetzt stellt sich heraus, dass es auf Win64 für einen unserer Kunden abstürzt.
Ich habe keine 64-Bit-Plattform zur Hand, aber ich gehe davon aus, dass der Grund ist:
Wenn die Funktion aufgerufen wird, werden die Argumente in den Stapel als 64-Bit-Werte geschoben.
Unter dieser Annahme glaube ich, dass das Problem durch das Ersetzen von int*
durch size_t*
behoben werden kann.
Meine Fragen sind:
- Ist meine Analyse richtig?
- Ist meine Lösung richtig?
- Gibt es einen "konventionellen" Weg, dies zu lösen?
Sie mit stdarg.h vertraut sind? – 2501
@ 2501: Ja, ich nehme an, dass du die Verwendung von 'va_list' und' va_args' implizierst? –
Sie sollten va_args für die Portabilität verwenden. Weitere Informationen finden Sie unter [Microsoft x86-Aufrufkonvention] (https://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention). Wenn Sie stdarg.h verwenden, kümmert sich Ihr Compiler darum. –