65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.28/5 (18投票s)

2006 年 11 月 17 日

2分钟阅读

viewsIcon

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++ 编程,所以我不确定这是否适用于该环境。

© . All rights reserved.