已安装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
请帮忙。
答案 0 :(得分:20)
项目中包含一个名为no_ms_shit.props的属性表(转换后)。对于MS在过去5年中一直试图做的事情,表中有相当多的仇恨表达。
他们有点过分关闭所有东西,甚至禁止链接到sprintf_s()。哪个是您的错误的来源,stdio.h标头省略了声明,但字符串标头使用它。不确定Express版是否支持编辑项目属性表,但零售版中的步骤是:
__STDC_WANT_SECURELIB__=0
更改为1 项目现在编译清洁。我确实收到了复制文件的构建错误,这是一个构建后的事件。如果您无法弄清楚如何解决问题,请启动另一个问题。
答案 1 :(得分:4)
奇怪。我有Visual Studio 2010 Ultimate,它甚至不允许我访问View-> Property Pages菜单项。它对我来说是禁用的。
但我只是去了no_ms_shit.props文件并在Notepad ++中编辑了:)。然后转到Project-> Properties-> Configuration Properties-> General,并选择'No'将警告视为错误,并在预处理器定义中添加_CRT_SECURE_NO_WARNINGS。
当他在Windows和Visual Studio中进行开发时,Don Ho应该顺其自然而不是诅咒ms shit。
<小时/> 在使用 Visual Studio 2012 Professional 时,这对我有用:
您必须编辑 no_ms_shit.vsprops (* .vsprops,而不仅仅是* .props!):
将__STDC_WANT_SECURE_LIB__=0
替换为__STDC_WANT_SECURE_LIB__=1
将 _CRT_SECURE_NO_WARNINGS 添加到预处理程序定义中。
答案 2 :(得分:2)
仔细查看源代码会显示大多数库调用会导致无穷无尽的噪音,除非您使用此属性表来自SciLexer.dll项目。 Scintilla是跨平台的,所以它不需要所有Windows特定的cruft。正如你所提到的,微软过度更换标准字符串库,因为他们试图避免缓冲区溢出可能是合法的。
所以你可以将这种批评指向Neil Hodgson(Scintilla的主要开发者),而不是Don Ho。
CChris