2016-05-09 5 views
-1

Только в Xcode (визуальная студия в порядке), я вижу разрыв swprintf, если вы попытаетесь поместить его в функцию-обертку с помощью va_args.va_args разрывает широкие строковые функции (swprintf) в XCode

Упрощенный пример:

void test(wchar_t *a_buffer, int a_buffer_size, const wchar_t* a_format, ...) 
{ 
    va_list args; 
    va_start(args, a_format); 
    ::swprintf(a_buffer, a_buffer_size, a_format, args); 
    va_end(args); 
} 

double value = 1.0; 
wchar_t text[32]; 
::swprintf(text, 32, L"%f", value); // this works (text=L"1.0000") 

test(text, 32, L"%f", 30.0); // this does not work (text=L"0.0000") 

Любая помощь приветствуется, это довольно трудная задача. Я предполагаю, что проблема связана с некоторыми причудами XCode.

Я уже перепутал с настройками и свойствами файла Locale, предложенными в этом вопросе: swprintf fails with unicode characters in xcode, but works in visual studio, но он не дал никаких изменений, это выглядит как отдельная проблема.

Спасибо.

+6

'swprintf()' does _not_ принимает аргумент varargs. Вы хотите использовать 'vswprintf()'. – mah

+0

vswprintf() действительно то, что мне нужно, спасибо. –

ответ

1

Если вы хотите, чтобы передать объект va_list, а затем использовать

int vswprintf(
    const wchar_t* buffer, 
    size_t bufsz, 
    const wchar_t* format, 
    va_list vlist); 

роспускного ... просто означает, что ее аргумент может изменяться по длине, но это не означает, что вы могли бы передать объект va_list напрямую ,

+0

Это действительно моя проблема, я думал, что va_list может быть передан ... функциям. Использование vswprintf внутри функции test() решило его, спасибо. –