7

已安装 Windows SDK。我之前使用 Visual C++ 2008 Express 成功构建了 N++。但是现在有了 2010 年,我收到了很多关于以下内容的错误消息sprintf_s

1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\string(676): error C2039: 'sprintf_s' : is not a member of '`global namespace''
1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\string(676): error C3861: 'sprintf_s': identifier not found

请帮忙。

4

3 回答 3

20

项目中包含一个名为 no_ms_shit.props 的属性表(转换后)。该表中表达了对 MS 在过去 5 年中一直试图做的事情的相当多的仇恨。

他们关闭所有东西有点过火了,他们甚至禁用了与 sprintf_s() 的链接。这是您的错误的根源,stdio.h 标头省略了声明,但字符串标头使用了它。不确定Express版是否支持编辑项目属性表,但零售版中的步骤是:

  • 查看 + 物业经理
  • 打开其中一个节点并找到“no ms shit”
  • 右键单击它,属性
  • C/C++、预处理器、预处理器定义
  • 更改__STDC_WANT_SECURELIB__=0为 1
  • 将 _CRT_SECURE_NO_WARNINGS 添加到这些定义中

该项目现在编译干净。我确实收到了复制文件的构建错误,这是一个构建后事件。如果您不知道如何解决它,请开始另一个问题。

于 2010-09-14T16:41:56.837 回答
4

奇怪的。我有 Visual Studio 2010 Ultimate,它甚至不允许我访问 View->Property Pages 菜单项。它对我来说是禁用的。

但我只是去了文件 no_ms_shit.props 并仅在 Notepad++ 中对其进行了编辑:)。然后转到项目->属性->配置属性->常规,并选择“否”将警告视为错误,并在预处理器定义中添加_CRT_SECURE_NO_WARNINGS。

Don Ho 在 Windows 和 Visual Studio 中进行开发时应该顺其自然,而不是诅咒 ms 狗屎。


这在使用Visual Studio 2012 Professional时对我有用:

  • 您必须编辑no_ms_shit.vsprops(*.vsprops,不仅是 *.props!):
    替换__STDC_WANT_SECURE_LIB__=0__STDC_WANT_SECURE_LIB__=1

  • _CRT_SECURE_NO_WARNINGS添加到预处理器定义中。

于 2010-11-01T00:40:16.983 回答
2

仔细查看源代码会发现,除非您使用此属性表,否则大多数会导致无穷无尽的噪音的库调用来自 SciLexer.dll 项目。Scintilla 是跨平台的,因此它不需要所有 Windows 特定的杂物。正如您所提到的,微软在替换标准字符串库方面做得太过火了,这与他们避免缓冲区溢出的尝试一样合法。

因此,您可以将此批评指向 Neil Hodgson(Scintilla 的主要开发人员)而不是 Don Ho。

克里斯

于 2010-12-06T13:50:14.083 回答