﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-liuliunumberone</title><link>http://www.cppblog.com/liuliunumberone/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 16 Apr 2026 01:11:26 GMT</lastBuildDate><pubDate>Thu, 16 Apr 2026 01:11:26 GMT</pubDate><ttl>60</ttl><item><title>#pragma once和ifndef使用异同</title><link>http://www.cppblog.com/liuliunumberone/archive/2011/06/02/147921.html</link><dc:creator>liuliunumberone</dc:creator><author>liuliunumberone</author><pubDate>Thu, 02 Jun 2011 02:17:00 GMT</pubDate><guid>http://www.cppblog.com/liuliunumberone/archive/2011/06/02/147921.html</guid><wfw:comment>http://www.cppblog.com/liuliunumberone/comments/147921.html</wfw:comment><comments>http://www.cppblog.com/liuliunumberone/archive/2011/06/02/147921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/liuliunumberone/comments/commentRss/147921.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/liuliunumberone/services/trackbacks/147921.html</trackback:ping><description><![CDATA[<div class="postbody">为了避免同一个文件被include多次<br /><br />1&nbsp;&nbsp; <span style="color: #ff0000">#ifndef方式</span><br />2&nbsp;&nbsp;<span style="color: #ff0000"> #pragma once方式<br /></span><br />在能够支持这两种方式的编译器上，二者并没有太大的区别，但是两者仍然还是有一些细微的区别。<br />&nbsp;&nbsp;&nbsp; <span style="color: #008000">方式一：</span> 
<p>&nbsp;&nbsp;&nbsp; #ifndef __SOMEFILE_H__<br />&nbsp;&nbsp;&nbsp; #define __SOMEFILE_H__<br />&nbsp;&nbsp;&nbsp; ... ... // 一些声明语句<br />&nbsp;&nbsp;&nbsp; #endif</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: #008000">方式二：</span></p>
<p>&nbsp;&nbsp;&nbsp; #pragma once<br />&nbsp;&nbsp;&nbsp; ... ... // 一些声明语句</p>
<p><br />&nbsp;&nbsp;&nbsp; #ifndef的方式依赖于宏名字不能冲突，这不光可以保证同一个文件不会被包含多次，也能保证内容完全相同的两个文件不会被不小心同时包含。当然，缺点就是如果不同头文件的宏名不小心&#8220;撞车&#8221;，可能就会导致头文件明明存在，编译器却硬说找不到声明的状况<br /><br />&nbsp;&nbsp;&nbsp; #pragma once则由编译器提供保证：同一个文件不会被包含多次。注意这里所说的&#8220;同一个文件&#8221;是指物理上的一个文件，而不是指内容相同的两个文件。带来的好处是，你不必再费劲想个宏名了，当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝，本方法不能保证他们不被重复包含。当然，相比宏名碰撞引发的&#8220;找不到声明&#8221;的问题，重复包含更容易被发现并修正。<br /><br />&nbsp;&nbsp; 方式一由语言支持所以移植性好，方式二 可以避免名字冲突<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; 实际上，我们平常包含的<font face="Verdana" color="#000000">#include "stdafx.h"</font>，其中的代码就是<br /></p>
<p><font face="Verdana" color="#000000">#pragma once</font></p>
<p><font face="Verdana" color="#000000">#include "targetver.h"</font></p>
<p><font face="Verdana" color="#000000">#include &lt;stdio.h&gt;<br />#include &lt;tchar.h&gt;</font></p>
<p>但是不用担心其中的stdio.h等被重复调用，因为，stdio.h中的内容是</p>
<p><font face="Verdana" color="#000000">#if&nbsp;&nbsp;&nbsp;&nbsp; _MSC_VER &gt; 1000<br />#pragma once<br />#endif</font></p>
<p><font face="Verdana" color="#000000"><span style="color: red">#ifndef _INC_STDIO</span><br /><span style="color: red">#define _INC_STDIO</span></font></p>
<p>。。。<br /></p></div><script type="text/javascript">
//<![CDATA[ Sys.WebForms.PageRequestManager._initialize('AjaxHolder$scriptmanager1', document.getElementById('Form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90);
//]]&gt;
</script><img src ="http://www.cppblog.com/liuliunumberone/aggbug/147921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/liuliunumberone/" target="_blank">liuliunumberone</a> 2011-06-02 10:17 <a href="http://www.cppblog.com/liuliunumberone/archive/2011/06/02/147921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>