我有一个项目使用_vscwprintf()
/ vswprintf()
(通过_vsctprintf()
/ _vstprintf()
)在malloc()
个缓冲区中创建任意长度的格式化字符串。
当我在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 ++,如果这有所不同。
答案 0 :(得分:1)
正如@Roger Rowland所说,由于Visual Studio 2008中的一个错误http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/b385ed64-d549-4cf3-af31-85a2e8da4b6a/ 你应该在Visual Studio 2008中传递3个参数,在新版本中传递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