保持清洁——VS2005 的字符串函数包装器






4.28/5 (18投票s)
2006 年 11 月 17 日
2分钟阅读

98155
一种使 stdio 函数无论使用哪种 Microsoft 编译器都能干净编译的技术。
引言
我需要维护最初在 Visual Studio 6.0 鼎盛时期编写的代码,但它也需要在较新的项目中被使用,这些项目是在 Visual Studio 2005 下编译的。 相关文件在两个编程团队之间共享 - 一个编写 VC6 代码,另一个编写 VS2005 代码 - 项目不同,但我们都注重代码重用。 我确信 CP 网站上至少还有另外三个人有同样的需求。
具体来说,我们的代码总是包含对几个标准 I/O 函数的使用,例如 sprintf
, printf
等等,而且我们都知道当你在 VS2005 中尝试使用这些函数时会发生什么 - 编译器会抛出数百(或数千)关于函数被弃用的警告。 快速修复方法是在程序设置中包含适当的预处理器定义,但这纯粹是懒惰。
我解决问题的方法
我的技术是编写一个包装函数,该函数将使用适当版本的 stdio 函数,具体取决于你使用的编译器版本。 这确实清理了我的代码,提高了可读性,因为预处理器代码都集中在一个地方,而不是分散在代码中(仅在一个文件中就有大约 50 个实例)。
// Determine which compiler we're using. For versions PRIOR to 2005, we use // the old ("unsecure" - guffaw) string functions that VS2005 pukes up // warnings on. This presents quite the pain in the butt when you're trying // to write code supported by multiple versions of Visual C. #define _VS2005_ #if _MSC_VER < 1400 #undef _VS2005_ #endif //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- int sprintf_ex(char* sDest, int nSize, char* sFormat, ...) { va_list argList; va_start(argList, sFormat); int nCount = 0; #ifdef _VS2005_ nCount = _vsnprintf_s(sDest, nSize, nSize-1, sFormat, argList); #else nCount = _vsnprintf(sDest, nSize, sFormat argList); #endif va_end(argList); return nCount; }
实现可能如下所示
char sTest[1024]; int nCount = sprintf_ex(sTest, sizeof(sTest), "%d %s", 5, "Test");
以类似的方式包装其他函数应该是一个简单的练习,但是由于我们没有这个需求,所以没有编写代码。 对于大多数 C++ 程序员来说,根据上面的例子,这应该是一个简单的练习。
什么?!没有可供下载的示例代码?!!!
哦,拜托。 如你所见,它只是一个函数包装器,展示了一个简单的技术。 我不会费劲为一些你只需要复制/粘贴到现有源文件中进行尝试的东西准备一个示例项目。 此外,你们都应该是程序员 - 如果需要,创建一个测试项目。
什么?!没有可供欣赏的截图?!!!
你们真有趣。 现在轮到我幽默了。
免责声明
我不用托管的 C++ 编程,所以我不确定这是否适用于该环境。