【发布时间】: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