【问题标题】:Compiled Legacy C++ Code in Visual Studio 2015 TCHAR issues在 Visual Studio 2015 TCHAR 问题中编译的旧版 C++ 代码
【发布时间】:2016-02-03 14:47:40
【问题描述】:

我正在处理一些我不太熟悉的遗留代码。当我从 Visual Studio 2012 重新编译 Visual Studio 2015 中的项目时遇到错误。

我对函数“_getts”有引用错误,这通常是 “tchar.h”。

我将我的 Visual Studio 2012 安装与我的 2015 安装进行了比较,我发现头文件“tchar.h”不再包含在发货安装中。经过进一步研究,我看到微软发布了“通用 CRT”,其中包含一些我看到的从 2015 年删除的头文件。在微软文档中,我看到 Visual Studio 2015 仍然明确引用“tchar.h”。

我认为这是一件非常简单的事情,以至于我明显忽略了这一点。如果有任何我错过的好文档也请提供。

谢谢

【问题讨论】:

  • gets() 已从 C11 和 C++11 标准中删除,其内置的缓冲区溢出错误使其非常危险。你需要移动到_getts_s(),它需要一个额外的参数来指定缓冲区大小。
  • 完美。感谢您的信息!

标签: c++ visual-studio-2012 visual-studio-2015 tchar


【解决方案1】:

_getts 只是一个宏定义,这就是链接器找不到它的原因。尝试在main()之前定义宏:

#define _getts _getws

【讨论】:

  • 这对我来说可以摆脱错误。只是出于好奇,我想知道为什么使用 vs 14.0 工具集运行会导致错误,但使用 vs 11.0 工具集它不会给我编译错误?另外,我刚刚看到“tchar.h”被移入了 Windows 通用 CRT,以便回答我的另一个问题。
  • @user3596611 v140 可能会有一些重大变化(尤其是当他们引入了通用 CRT 时),但我很确定他们不敢删除 TCHAR。可能是一个错误或其他什么,没有代码我无法判断。如果我的回答对您有帮助,请将其标记为答案。
  • 我忘了更新这个帖子,但这个问题是通用 CRT 的重大更改的结果。我不得不做一些阅读并了解 v140 的变化。
【解决方案2】:

_getts 宏用于解析为 gets (ANSI) 或 _getws (Unicode),具体取决于字符集设置。在 VC++ 2015 中,这两个函数以及宏本身都已停用。

来自Breaking Changes in Visual C++ 2015

gets 和 _getws 函数已被删除。 get 函数已从 C11 中的 C 标准库中删除,因为它不能安全使用。 _getws 函数是一个 Microsoft 扩展,它等效于获取但用于宽字符串。作为这些函数的替代方法,请考虑使用 fgets、fgetws、gets_s 和 _getws_s。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 2019-04-26
    相关资源
    最近更新 更多