Сбой вызова swprint из отдельной библиотеки - PullRequest
2 голосов
/ 21 мая 2009

У меня странная проблема. Я использую sprintf или swprintf в соответствии с определением сборки с Юникодом или без него. Я обернул эти функции в свою собственную функцию так:

int mysprintf( MCHAR* str,size_t size, const MCHAR* format, ... )
{
#ifdef MYUNICODE
    return swprintf( str, size, format);
#else
    return snprintf( str, format);
#endif
}

Эти функции находятся в классе String, который является отдельным проектом и скомпилирован как библиотека. Я использую это в другой программе. Теперь, если я использую mysprintf ()

msprintf(str,10, _M("%d,%d"),height,width);

Я получаю некоторые значения мусора в строковом буфере. Но если я напрямую вызываю функцию swprintf из программы, она работает нормально. Я определил UNICODE в сборке, и вызывается функция swprintf, но она заполняет некоторые значения мусора. Я не понимаю, что происходит не так.

Спасибо Amit

Ответы [ 2 ]

1 голос
/ 21 мая 2009

Проблема действительно заключается в том, что у вас есть собственная функция с переменным количеством параметров. Вам нужно получить указатель на список аргументов и передать его вызываемым лицам. va_start позволяет вам сделать это, и ему нужен последний указатель в списке аргументов вашей функции.

   int mysprintf( MCHAR* str, size_t size, const MCHAR* format, ... )
    {
      va_list args;
      va_start(args, format);

      int result;

    #ifdef MYUNICODE
        result = vswprintf( str, size, format, args);
    #else
        result = ..
    #endif

      va_end(args);

      return result;
   }

Ура!

1 голос
/ 21 мая 2009

Вам нужно передать параметры ... из функции mysprintf в функции prrintf, которые она содержит. Для этого вам следует использовать семейство функций vprintf () - подробности см. http://msdn.microsoft.com/en-us/library/0zf95wk0%28VS.71%29.aspx.

...