2013-10-11 7 views
3

Я использую VS2010 Pro компилятор, когда я строю на x64, я получаю ниже ошибки компиляции. Компилируется отлично на x86. ошибка C2704: '': __va_start присущий допускается только в переменной длиныЗначение ошибки компиляции: ошибка C2704: __va_start intrinsic разрешено только в 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; 
} 

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

ответ

6

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

Спасибо, почему это не проблема в компиляции x86? – Coder777

+0

@John Это может быть проблемой, вы просто не получаете диагностику. – Yakk

+1

Мое единственное предположение (почему вы не получаете сообщение об ошибке в x86) является ошибкой компилятора. – drescherjm

1

Вы использовали макрос в список переменной длины функции с фиксированным числом аргументов; MSDN link to the error.

2

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

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