我们(错误地)使用StringCbPrintfW来编写数据库查询,该查询在使用逗号作为小数分隔符的任何地区都不幸失败。修复很容易,对吧?采用区域设置的StringCbPrintf_lW也在strsecur.h中定义。这两个方面的定义如下:
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)因此,只需创建区域设置并将StringCbPrintfW替换为StringCbPrintf_lW即可。
智能感知是快乐的,GoToDefinition是快乐的,ClCompile不是快乐的。我一直在
错误C3861:“StringCbPrintf_lW”:未找到标识符
有什么不对吗?
发布于 2016-05-25 14:59:21
header Strsafe.h .h定义了有问题的方法,使用两种定义来过滤此函数,如下所示:
#if defined(STRSAFE_LOCALE_FUNCTIONS) && !defined(STRSAFE_NO_CB_FUNCTIONS)
/*++
STDAPI
StringCbPrintf_l(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) LPTSTR pszDest,
_In_ size_t cbDest,
_In_ _Printf_format_string_params_(2) LPCTSTR pszFormat,
_In_ locale_t locale,
...
);
Routine Description:
This routine is a version of StringCbPrintf that also takes a locale.
Please see notes for StringCbPrintf above.
--*/
#ifdef UNICODE
#pragma region Application Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
#define StringCbPrintf_l StringCbPrintf_lW
// ...简而言之,在包含标头之前,需要定义STRSAFE_LOCALE_FUNCTIONS。如:
#define STRSAFE_LOCALE_FUNCTIONS
#ifdef STRSAFE_NO_CB_FUNCTIONS
#pragma message("NO CB FUNCTIONS")
#endif
#include <strsafe.h>发布于 2016-05-25 15:37:23
在<strsafe.h>头中搜索,您将注意到StringCbPrintf_lW函数由一个预处理器#if保护,如下所示:
#如果定义(STRSAFE_LOCALE_FUNCTIONS)& !defined(STRSAFE_NO_CB_FUNCTIONS)
因此,要在代码中启用已格式化的API,只需定义STRSAFE_LOCALE_FUNCTIONS宏和未定义STRSAFE_NO_CB_FUNCTIONS宏即可。
在VS2015中,我注意到默认情况下这两个宏都没有定义。
因此,您只需要在包含标题之前进行#define STRSAFE_LOCALE_FUNCTIONS:
#define STRSAFE_LOCALE_FUNCTIONS
#include <strsafe.h>您还可以使用Visual在整个项目级别定义该预处理器宏,如下所示: Properties、、list /C++、preprocessor并将其添加到预处理器定义中的列表中。
https://stackoverflow.com/questions/37440682
复制相似问题