Определение версии vswprintf() в Visual C++

У меня есть проект, который использует _vscwprintf()/vswprintf() (через _vsctprintf()/_vstprintf()) для создания форматированных строк произвольной длины в буферах malloc()ed.

Когда я запускал проект под Visual C++ 2008, _vstprintf() принимал три параметра:

int vswprintf(wchar_t * _String, const wchar_t * _Format, va_list _Ap)

Но покинув свой проект на некоторое время, когда я вернулся к нему с Visual C++ 2012, я обнаружил, что MS изменила функцию, чтобы она принимала четыре параметра:

int vswprintf(wchar_t * _String, size_t _Count, const wchar_t * _Format, va_list _Ap)

Я хотел бы, чтобы мой код можно было построить в Visual C++ 2008, 2010 и 2012 (он также переносим на Linux и Solaris).

Есть ли какой-то символ, который я могу проверить с помощью #ifdef, чтобы я мог правильно построить версию функции с 3 или 4 параметрами?

Я предполагаю, что есть символ, который сообщает мне, под какой версией Visual C++ я компилирую, но правильно ли это сделать? Например, существует ли вероятность того, что более новый компилятор может быть собран со старой библиотекой C или средой выполнения, или наоборот?

Мой код на самом деле использует C, а не C++, если это имеет значение.


person hippietrail    schedule 20.03.2013    source источник
comment
Вы уверены, что это другое? MSDN для VS2008 имеет 4 аргумента, а не 3. msdn.microsoft.com/en-GB/library/28d5ce15(v=vs.90).aspx   -  person Roger Rowland    schedule 20.03.2013
comment
Да, я не совсем вникаю в документацию, похоже, она была написана без особого внимания и внимания к деталям. Но я могу заверить вас, что последние пару лет он работает с 3 аргументами под VS2008 просто отлично. Кажется, он работает и в VS2010, но в VS2012 вызывал ошибки, и мне пришлось изменить код.   -  person hippietrail    schedule 20.03.2013
comment
Похоже, это была ошибка в VS2008 — social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/   -  person Roger Rowland    schedule 20.03.2013
comment
(Мой код доступен на Wikimedia Toolsserver Fisheye: indexwiki)   -  person hippietrail    schedule 20.03.2013
comment
@roger_rowland: Да, предлагаемый обходной путь использования _vstprintf_s(), кажется, работает правильно в VS2008, VS2010 и VS2012.   -  person hippietrail    schedule 20.03.2013


Ответы (1)


Как сказал @Roger Rowland, из-за ошибки в Visual Studio 2008 /" rel="nofollow">http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/b385ed64-d549-4cf3-af31-85a2e8da4b6a/ вы должны передать 3 аргумента в Visual Studio 2008 и 4 расширения в более новых версиях

#ifdef _MSC_VER <= 1500 //Visual Studio 2008 or ealier
// use 3 parameters version here
#else //later than Visual Studio 2008
// use 4 parameters version herse
#endif
person Muhammad Annaqeeb    schedule 22.11.2014