﻿<?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++博客-sparksun</title><link>http://www.cppblog.com/sparksun/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 00:17:01 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 00:17:01 GMT</pubDate><ttl>60</ttl><item><title>#pragma once与 #ifndef的区别</title><link>http://www.cppblog.com/sparksun/archive/2011/03/12/Spark.html</link><dc:creator>Spark</dc:creator><author>Spark</author><pubDate>Sat, 12 Mar 2011 06:02:00 GMT</pubDate><guid>http://www.cppblog.com/sparksun/archive/2011/03/12/Spark.html</guid><wfw:comment>http://www.cppblog.com/sparksun/comments/141640.html</wfw:comment><comments>http://www.cppblog.com/sparksun/archive/2011/03/12/Spark.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/sparksun/comments/commentRss/141640.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sparksun/services/trackbacks/141640.html</trackback:ping><description><![CDATA[<div class=postcontent>为了避免同一个文件被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; 方式一由语言支持所以移植性好，方式二 可以避免名字冲突</p>
</div>
<img src ="http://www.cppblog.com/sparksun/aggbug/141640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sparksun/" target="_blank">Spark</a> 2011-03-12 14:02 <a href="http://www.cppblog.com/sparksun/archive/2011/03/12/Spark.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>