Я использую компилятор VS2010 Pro, когда я строю на x64, я получаю ниже ошибки компиляции. Отлично компилируется на x86.
ошибка C2704: »: встроенная функция __va_start разрешена только в varargs
Декларация метода:
int foo(char* buf, int maxChar, const char*& fmt);
определение:
int foo(char* buf, int maxChar, const char*& fmt)
{
int numChar = 0;
if (fmt)
{
va_list plist;
va_start(plist, fmt);
numChar = _vsnprintf(buf, maxChar, fmt, plist);
va_end(plist);
}
return numChar;
}
В чем смысл ошибки? Как это исправить?
Я думаю, что это в значительной степени означает, что это говорит. Компилятор не позволит вам использовать va_start
, va_arg
и т. д., кроме функции с переменным аргументом. С помощью va_start
вне функции vararg не имеет смысла.
Это не определяет переменную функцию аргумента:
int foo(char* buf, int maxChar, const char*& fmt)
Это делает:
int foo(char* buf, int maxChar, const char*& fmt, ...)
На x86 все аргументы передаются в стеке, и это семантически безопасно (хотя и некорректно) для использования va_start
и друзья, чтобы получить «аргументы».
Однако на amd64 (и, скорее всего, на ARM), некоторые аргументы передаются через регистры. В этом случае, используя va_start
в функции, которая не объявлена для принятия переменных аргументов, семантически небезопасна — va_start
будет индексировать в недействительной памяти.
Вы использовали макрос varargs в функции с фиксированным числом аргументов; MSDN ссылка на ошибку.