Я использую следующую функцию в течение некоторого времени:функция VARIADIC работает в Win32, но не в Win64
void AddRow(int iNumOfColumns,...)
{
int* pValuePerColumn = (int*)&iNumOfColumns+1;
for (int i=0; i<iNumOfColumns; i++)
{
// Do something with pValuePerColumn[i]
}
}
Теперь выясняется, что он выходит из строя на Win64 для одного из наших клиентов.
не имеют 64-битную платформу под рукой, но я предполагаю, что причина:
При вызове функции, аргументы помещаются в стек в виде 64-битных значений.
В этом предположении, я считаю, что замена int*
на size_t*
должна помочь решить эту проблему.
Мои вопросы:
- Является ли мой анализ правильно?
- Правильно ли мое решение?
- Есть ли более «обычный» способ решения этого?
Вы знакомы с stdarg.h? – 2501
@ 2501: Да, я предполагаю, что вы подразумеваете использование 'va_list' и' va_args'? –
Вы должны использовать va_args для переносимости. Для получения дополнительной информации см. [Соглашение о вызовах Microsoft x86] (https://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention). В любом случае, используя stdarg.h, ваш компилятор позаботится об этом. –