【问题标题】:In what header file the function `_tcscpy_s` is declared?在哪个头文件中声明了函数`_tcscpy_s`?
【发布时间】:2015-10-01 08:37:14
【问题描述】:

Visual Studio 2015。我正在阅读“Windows via C\C++”一书并尝试使用其代码示例。作者写道,字符串的“安全”函数具有_s 后缀,并在StrSafe.h 标头中声明。此标头将是包含列表中的最后一个。在我的代码中,我包含了这样的标题:

#include <iostream>
#include <exception>
#include <string>
#include <Windows.h>
#include <strsafe.h>

但我有一个问题:

// IDE doesn't see the _tcscpy_s function
errno_t result = _tcscpy_s(szBuffer, _countof(szBuffer), TEXT("0123456789"));

looked 获取有关_tcscpy_s 函数的信息,但我没有看到有关其头文件的信息(我预计它是strsafe.h)。

我该如何解决?

【问题讨论】:

  • 你应该停止使用 tchar。当我们想为 Win98 和 WinNT 编译时,它很有用。但那些日子早已一去不复返了。请改用 Unicode 文本。
  • 为什么? TCHAR 的使用很灵活。本书作者建议这样做。
  • 没有。 TCHAR 只是让你感到困惑。它增加了复杂性,却没有任何收获。你的目标不是Win98。您不想使用 ANSI 削弱用户。使用 Unicode 文本。并停止使用这些 C RTL 函数并使用 C++ std lib 字符串类型。在这种情况下std::wstring.
  • 但是TCHAR 是宏。在项目设置中定义UNICODE_UNICODE 时是Unicode (wchar_t)(默认为用户)。作者建议使用 WinAPI 类型来获得清晰的代码。此类类型对于 Windows 程序员来说是明确的,并且对于 MSDN 的类型是一致的。
  • @Medinoc 我对明确的W 后缀没有任何问题。我也认为定义UNICODE_UNICODE 并让宏添加W 后缀是很好的。您永远不会调用 ANSI API。如果你想做 UTF-8 工作,那么它需要在你的代码和 Windows API 之间的边界处转换为/从 UTF-16 转换。尽可能靠近边界。

标签: c++ string visual-studio winapi


【解决方案1】:

就像任何其他“通用文本”字符串函数版本一样,_tcscpy_s() 函数在 TCHAR.H 中声明(如 documentation 中所述)。

#include &lt;tchar.h&gt; 添加到您的代码中。

【讨论】:

    猜你喜欢
    • 2013-10-07
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多