“_snprintf”: 不是“std”的成员
- 确定 MSVC 的版本
snprintf 的 C++11 标准实现与 MSVC 版本 直接相关,不同版本的 MSVC 对 C++11 标准的支持程度不同,尤其是在 std::snprintf 的实现上存在差异。
MSVC 版本 | _MSC_VER | 是否支持 std::snprintf | 替代实现 | 兼容性说明 |
---|---|---|---|---|
MSVC 2015+ (Visual Studio 2015 及更新) | >= 1900 | ✅ 支持 | 无 | 完全遵循 C++11, 将 snprintf 定义在 std 命名空间。 |
MSVC 2013 (Visual Studio 2013) | 1800 | ❌ 不支持 | ::_snprintf_s | 需使用全局命名空间的 _snprintf_s,且参数格式不同。 |
MSVC 2012 及更早 | < 1800 | ❌ 不支持 | ::_snprintf | 仅提供非标准的 _snprintf,安全性较差(不检查缓冲区溢出)。 |
- 确定自己的代码或引用的第三方库有兼容性处理。如果没有,添加类似下面 Boost 这样的代码
#if ( defined(_MSC_VER) && _MSC_VER < 1900 ) || ( defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) )
# define BOOST_ASSERT_SNPRINTF(buffer, format, arg) std::sprintf(buffer, format, arg)
#else
# define BOOST_ASSERT_SNPRINTF(buffer, format, arg) std::snprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), format, arg)
#endif
- 如果确定了是 MSVC 2015 以上且有兼容性处理,但还是提示错误的话,建议用 VS Code 搜索整个项目,是否有下面的代码,比如 Python.h 的头文件里。
#define snprintf _snprintf
- 如果存在,根据自己的情况,决定是注释该代码,或在自己的代码重新定义。
就博主而言,是混合使用 Python C API 和 C++ 时,删除了 #include <Python.h>,仅使用 #include <pybind11/pybind11.h>。pybind11 已经做了平台兼容处理。