<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Apex[有所思,有所志] &#187; VC</title>
	<atom:link href="http://apex.ncksoft.com/archives/tag/vc/feed" rel="self" type="application/rss+xml" />
	<link>http://apex.ncksoft.com</link>
	<description>日有所思，夜有所志</description>
	<lastBuildDate>Sat, 06 Feb 2010 18:12:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>当遇到C4995警告时该怎么办？</title>
		<link>http://apex.ncksoft.com/archives/293</link>
		<comments>http://apex.ncksoft.com/archives/293#comments</comments>
		<pubDate>Sat, 06 Feb 2010 18:12:04 +0000</pubDate>
		<dc:creator>Apex</dc:creator>
				<category><![CDATA[代码人生]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[VC]]></category>

		<guid isPermaLink="false">http://apex.ncksoft.com/?p=293</guid>
		<description><![CDATA[使用Visual Studio 2008写代码时，编译时遇到警告：
1&#62;d:\program\msvs2008\vc\include\cstdio(49) : warning C4995: 'gets': name was marked as #pragma deprecated
1&#62;d:\program\msvs2008\vc\include\cstdio(53) : warning C4995: 'sprintf': name was marked as #pragma deprecated
1&#62;d:\program\msvs2008\vc\include\cstdio(56) : warning C4995: 'vsprintf': name was marked as #pragma deprecated
1&#62;d:\program\msvs2008\vc\include\cstring(22) : warning C4995: 'strcat': name was marked as #pragma deprecated
1&#62;d:\program\msvs2008\vc\include\cstring(23) : warning C4995: 'strcpy': name was marked as #pragma deprecated
1&#62;d:\program\msvs2008\vc\include\cwchar(36) : warning [...]]]></description>
			<content:encoded><![CDATA[<p>使用Visual Studio 2008写代码时，编译时遇到警告：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">1&gt;d:\program\msvs2008\vc\include\cstdio(49) : warning C4995: 'gets': name was marked as #pragma deprecated</li>
<li>1&gt;d:\program\msvs2008\vc\include\cstdio(53) : warning C4995: 'sprintf': name was marked as #pragma deprecated</li>
<li>1&gt;d:\program\msvs2008\vc\include\cstdio(56) : warning C4995: 'vsprintf': name was marked as #pragma deprecated</li>
<li>1&gt;d:\program\msvs2008\vc\include\cstring(22) : warning C4995: 'strcat': name was marked as #pragma deprecated</li>
<li>1&gt;d:\program\msvs2008\vc\include\cstring(23) : warning C4995: 'strcpy': name was marked as #pragma deprecated</li>
<li>1&gt;d:\program\msvs2008\vc\include\cwchar(36) : warning C4995: 'swprintf': name was marked as #pragma deprecated</li>
<li>1&gt;d:\program\msvs2008\vc\include\cwchar(37) : warning C4995: 'vswprintf': name was marked as #pragma deprecated</li>
<li>1&gt;d:\program\msvs2008\vc\include\cwchar(39) : warning C4995: 'wcscat': name was marked as #pragma deprecated</li>
<li>1&gt;d:\program\msvs2008\vc\include\cwchar(41) : warning C4995: 'wcscpy': name was marked as #pragma deprecated</li></ol></div>
<p>意思是说，某个函数已经被标记为过时了，最好不要用，在将来的版本中，该函数可能就没有了，不存在了。</p>
<p>奇怪的是，代码里面并没有使用这些函数啊。但是先不考虑这个了，还是看看如何解决吧。对于编译器警告，当然可以用 #pragma warning(disable: xxxx ) 的语法将其禁止掉，这样编译时编译器就不会在那里唧唧歪歪了。在网上查找此类问题，基本上都是这样说的。</p>
<p>然后仔细想想，关闭这个警告并不正常，因为这样一来，所有过时的函数都不会再警告了，而我们可能是需要这个警告的，像是对于strcpy这种超常用的函数，考虑到安全性（应对缓冲区溢出攻击），我们的确应该使用其安全版本，例如strcpy就有对应的StringCchCopy/StringCbCopy这样的函数，如果关闭了此警告，我们就可能在代码中不小心写下strcpy，而不是其对应的安全版本（当然，strcpy等函数是特例，关闭C4995警告后，仍然会有其他警告，下面有说明）。</p>
<p>所以，考察上述几个函数，我们知道其函数声明所在的头文件，这些头文件中的函数应该都不会用到，所以可以用另一种方式来避免引入这些头文件：</p>
<p>在你的工程的预编译头文件（一般来说，就是stdafx.h）中，在 #pragma once 一行后面加上下列三行：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span class="hl-prepro">#define</span><span class="hl-code"> </span><span class="hl-identifier">_CSTDIO_</span><span class="hl-prepro"></span><span class="hl-code"></span></li>
<li><span class="hl-code"></span><span class="hl-prepro">#define</span><span class="hl-code"> </span><span class="hl-identifier">_CSTRING_</span><span class="hl-prepro"></span><span class="hl-code"></span></li>
<li><span class="hl-code"></span><span class="hl-prepro">#define</span><span class="hl-code"> </span><span class="hl-identifier">_CWCHAR_</span></li></ol></div>
<p>这样，编译器就不会再加载 cstdio / cstring / cwchar 这几个头文件了。</p>
<p><strong>P.S.</strong><br />
使用 #pragma warning(disable: xxxx) 这种方式关闭警告后，如果代码里面用到了 strcpy 这样的函数，编译器会报另一个警告：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">1&gt;e:\work\ncksoft\test\main.cpp(126) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.</li>
<li>1&gt;&nbsp; &nbsp; &nbsp; &nbsp; d:\program\msvs2008\vc\include\string.h(74) : see declaration of 'strcpy'</li></ol></div>
<p>所以我们仍然可以得到想要的警告信息。</p>
<p><strong>再 P.S.</strong><br />
如果在代码中使用 #pragma deprecated( name_of_deprecated ) ，就会在编译时报 C4995 警告，而使用下面的方法，则会报 C4996 警告：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span class="hl-identifier">__declspec</span><span class="hl-brackets">(</span><span class="hl-identifier">deprecated</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-types">void</span><span class="hl-code"> </span><span class="hl-identifier">foo</span><span class="hl-brackets">(</span><span class="hl-types">int</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code"></span></li>
<li><span class="hl-code">&nbsp;&nbsp; </span><span class="hl-comment">// ...</span><span class="hl-code"></span></li>
<li><span class="hl-code"></span><span class="hl-brackets">}</span></li></ol></div>
<p><strong>再 再 P.S.</strong><br />
我很讨厌那些将警告信息视作无物的程序员，一点美感都没有！</p>
]]></content:encoded>
			<wfw:commentRss>http://apex.ncksoft.com/archives/293/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
