旧版CStdString代码遇std::_USE未定义,注释微软分支后编译正常是否可行?
关于CStdString中SS_USE_FACET宏微软分支注释后的可行性问题
我们有一段2005年1月版本的代码,使用了作为std::string包装类的CStdString。该类通过宏SS_USE_FACET封装std::use_facet函数,针对Microsoft C++有特殊实现,使用替代宏_USE。现在我们遇到错误“_USE is not a member of std”。注释掉宏定义中的Microsoft特定分支后代码编译正常,注释后的宏定义如下:
#if defined(__SGI_STL_PORT) && (__SGI_STL_PORT >= 0x400 ) #if defined(__STL_NO_EXPLICIT_FUNCTION_TMPL_ARGS) && defined(_MSC_VER) #ifdef SS_ANSI #pragma schMSG(__STL_NO_EXPLICIT_FUNCTION_TMPL_ARGS defined!!) #endif #endif #define SS_USE_FACET(loc, fac) std::use_facet<fac >(loc) //#elif defined(_MSC_VER ) // #define SS_USE_FACET(loc, fac) std::_USE(loc, fac) // ...and #elif defined(_RWSTD_NO_TEMPLATE_ON_RETURN_TYPE) #define SS_USE_FACET(loc, fac) std::use_facet(loc, (fac*)0) #else #define SS_USE_FACET(loc, fac) std::use_facet<fac >(loc) #endif
请问这样操作是否可行?能否认为微软已采用标准实现并移除了特殊宏_USE?
这种操作完全可行,而且你的判断完全正确——微软早已在后续的编译器版本中切换到标准的std::use_facet实现,移除了std::_USE这个非标准扩展。
具体原因拆解:
- 你手里的代码是2005年的版本,当时的MSVC(比如VS2005)还在使用自家的非标准STL实现,
std::_USE是当时为了适配旧代码逻辑或者实现特定功能的私有扩展。 - 随着C++标准的推广和MSVC对标准兼容性的持续跟进,从VS2010之后的版本开始,MSVC的STL实现逐步向标准靠拢,到现在的现代MSVC(VS2017及以后)已经完全支持标准的
std::use_facet接口,不再需要依赖std::_USE这种非标准写法。 - 你注释掉微软特定分支后编译正常,这直接验证了当前使用的MSVC版本已经完全兼容标准调用,也坐实了微软确实移除了这个老旧的非标准宏。
额外建议:
- 如果你的代码需要兼容VS2005及更早的古董级MSVC版本,那可能需要保留这个分支;但如果你的编译环境已经升级到较新的MSVC版本,完全可以安全地删除这个旧分支,统一使用标准实现。
- 可以逐步把代码里的非标准STL用法替换成标准写法,这样能提升代码的可移植性,也能减少未来的维护成本。
内容的提问来源于stack exchange,提问作者Phil Jollans
相关产品推荐
相关产品推荐

