Значение ошибки компиляции: ошибка C2704: встроенная функция __va_start разрешена только в varargs?

Я использую компилятор 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;
}

В чем смысл ошибки? Как это исправить?

3

Решение

Я думаю, что это в значительной степени означает, что это говорит. Компилятор не позволит вам использовать 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, ...)
7

Другие решения

На x86 все аргументы передаются в стеке, и это семантически безопасно (хотя и некорректно) для использования va_start и друзья, чтобы получить «аргументы».

Однако на amd64 (и, скорее всего, на ARM), некоторые аргументы передаются через регистры. В этом случае, используя va_start в функции, которая не объявлена ​​для принятия переменных аргументов, семантически небезопасна — va_start будет индексировать в недействительной памяти.

2

Вы использовали макрос varargs в функции с фиксированным числом аргументов; MSDN ссылка на ошибку.

1
По вопросам рекламы [email protected]