макрос sprint_f в Linux для кроссплатформенного приложения - PullRequest
1 голос
/ 04 ноября 2010

Я портирую существующее приложение Windows на Linux.

Большинство API-интерфейсов ОС \ нестандартных функций расширения Microsoft могут быть легко (более или менее ...) заменены эквивалентными Linux \ GCCAPI, однако, я не знаю, как обращаться с sprintf_s, который получает переменное число аргументов.

У кого-нибудь есть идея (если вы можете также привести пример кода) для этого?

Спасибо всем заранее.

Ответы [ 5 ]

5 голосов
/ 04 ноября 2010

Во-первых, можете ли вы просто портировать свой код для использования iostreams C ++ (например, ostringstream)? Это полностью устранило бы все возможные проблемы со строкой функций sprintf, и, если число точек вызова ограничено, вероятно, лучший вариант.

Если это не вариант: функция sprintf_s в основном является помощником для предотвращения ошибок (и внешних злоупотреблений, вызывающих переполнение буфера. Из http://msdn.microsoft.com/en-us/library/ce3zzk1k%28VS.80%29.aspx мы узнаем, что она делает две вещи: строка формата для допустимых форматов (это не означает, что она выполняет проверку типов - она ​​все еще не может этого сделать), и она позволяет указывать максимальную длину.

Лучшей заменой будет snprintf, который имеет ограничения по сравнению с sprintf_s. Это не сделает проверку строки формата. И не все версии гарантируют, что окончательная строка будет иметь нулевое окончание: вы всегда хотите также сохранить нулевое значение в последнем символе вашего буфера после вызова, чтобы гарантировать, что окончательная строка заканчивается нулем.

0 голосов
/ 10 мая 2016

Добавить в конец вашего заголовочного файла или в начало исходного файла:

#ifndef _WIN32
    #define sprintf_s(dest,len,format,...) sprintf(dest,format,__VA_ARGS__)
#endif
0 голосов
/ 04 ноября 2010

sprintf_s - это просто «безопасная» версия (в качестве дополнительного аргумента используется длина буфера) sprintf, разве вы не можете использовать sprintf для своего порта?

0 голосов
/ 04 ноября 2010

Почему бы просто не предоставить условно скомпилированную реализацию sprintf_s для Linux? Эта реализация может просто игнорировать дополнительный аргумент и вызывать метод sprintf ().

0 голосов
/ 04 ноября 2010

snprintf имеет такую ​​же подпись, но AFAIK ведет себя немного иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...