4

我们(错误地)使用 StringCbPrintfW 编写了一个数据库查询,该查询在任何使用逗号作为小数分隔符的语言环境中都失败了。修复很容易,对吧?采用语言环境的 StringCbPrintf_lW 也在 strsafe.h 中定义。两者都定义如下:

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)

所以只需创建语言环境并将 StringCbPrintfW 替换为 StringCbPrintf_lW。

Intellisense 高兴,GoToDefinition 高兴,ClCompile 不高兴。我不断得到

错误 C3861:“StringCbPrintf_lW”:未找到标识符

有什么想法有什么问题吗?

4

2 回答 2

5

头文件 Strsafe.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-25T14:59:21.877 回答
1

<strsafe.h>标头中深入研究,您会注意到该 StringCbPrintf_lW函数由如下预处理器保护#if

#if defined(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 Studio IDE 在整个项目级别定义该预处理器宏,如下所示:配置属性 | C/C++ | Preprocessor并将其添加到Preprocessor Definitions的列表中。

于 2016-05-25T15:37:23.953 回答