看了看 ifndef 和#vs pragma oncee 的区别

为了避免同一个文件被include多次
#ifndef方式
#pragma once方式
在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。
#ifndef SOMEFILE_H
#define SOMEFILE_H
… … // 一些声明语句
#pragma once
... ... // 一些声明语句
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况
#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
方式一由语言支持所以移植性好,方式二 可以避免名字冲突
本文已收录于以下专栏:
相关文章推荐
原文地址:http://blog.csdn.net/hkx1n/article/details/4313303
作用:为了避免同一个文件被include多次,C/C++中有两种方式,一种是#if...
#pragma once
  这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次
  #pragma once用来防止某个头文件被多次include,#i...
原文链接:/Braveliu/archive//2838726.html
【1】#pragma once这个宏有什么作用?
转摘自: /content/10/458_.shtml #pragma once 指令格式如下:#pragma once...
0.形式不同
#ifndef方式:    
#ifndef __FILENAME_H__
#define __FILENAME_H__
... ... // 一些...
在最开始接触到C语言的时候,看到很多大牛们写的代码里面就有#ifndef  #define #endif 这三条语句,当时不明白什么意思,慢慢的后来自己也开始用了,也知道了他们合起来使用时为了防止头文...
#ifndef这种是最早期使用的方法,是基于语言的宏定义名字不能冲突的前提下的。这种方法不仅能保证同一个头文件不会被包含两次,也可以保证内容完全相同的两个文件也只能被包含一次。但是他优缺点,就是你的#...
引用:http://blog.csdn.net/zlhy_/article/details/8192580
在最开始接触到C语言的时候,看到很多大牛们写的代码里面就有#ifndef  #define ...
在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作。
1. #pragma message 指令
message能够在编译消息输出窗口中输出相...
在最开始接触到C语言的时候,看到很多大牛们写的代码里面就有#ifndef  #define #endif 这三条语句,当时不明白什么意思,慢慢的后来自己也开始用了,也知道了他们合起来使用时为了防止头文...
他的最新文章
讲师:刘文志
讲师:陈伟
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)#pragma once 和 #ifndef #define …#endif 有什么不同?
我的图书馆
#pragma once 和 #ifndef #define …#endif 有什么不同?
#pragma once 和 #ifndef #define …#endif 有什么不同?
#infndef XX
#define XX
&&&& #if _MSC_VER & 1000&
&&&&&&&#pragma once
&&& #endif
从只让头文件只编译一次的角度去看,似乎两种方法是一样的。但查看MSND后发现应该是不一样的。看MSDN对#pragma once 的定义:
#pragma once
Specifies that the file, in which the pragma resides, will be included (opened) only once by the compiler in a build. A common use for this pragma is the following:一个是让编译器只打开一次文件,而如果只有#ifndef #define …#endif 的话,虽然编译器只编译一次头文件,但是他还是会打开这个文件N多次。
注意:&& _MSC_VER 是出于版本兼容性考虑,定义
&&&&&&&&&&&&&&& Defines the compiler version. Defined as 1200 for Microsoft Visual C++ 6.0. Always defined.
———————-
#pragma是一种编译指令,使用格式为#pragma & token-string,象 & & #pragma & data_seg(".mdata")…..#pragma & data_seg()可以让编译器把两者之间的所有已初始化变量放入一个新的.mdata段中。 & & 而#pragma & once的意思是要求编译器在编译过程中只将包含此命令文件编译(打开)一次,从而避免重复包含此文件。
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢#pragma once与#ifndef的区别 - 竹山一叶 - 博客园
& & & #pragma once 是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次 & & & #pragma once用来防止某个头文件被多次include
& & & #ifndef,#define,#endif用来防止某个宏被多次定义。
  #pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了。   #ifndef,#define,#endif这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式&
  作用:   为了避免同一个文件被include多次   1 #ifndef方式   2 #pragma once方式   在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。&
  方式一:   #ifndef __SOMEFILE_H__   #define __SOMEFILE_H__   ... ... // 一些声明语句   #endif&
  方式二:   #pragma once   ... ... // 一些声明语句&
  #ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况 。  #pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。&
  方式一由语言支持所以移植性好,方式二可以避免名字冲突
Supported&(since 3.4)
Supported&(since at least A.06.12)
Supported&(since 13.1.1)
Supported&(since 4.2)
Not supported在C++中防止头文件被重复包含时为什么同时使用#ifndef和#pragma once? - 知乎13被浏览1157分享邀请回答2添加评论分享收藏感谢收起6添加评论分享收藏感谢收起查看更多回答 #pragma once
  这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次
  #pragma once用来防止某个头文件被多次include,#ifndef,#define,#endif用来防止某个宏被多次定义。
  #pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了。
  #ifndef,#define,#endif这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式
  #pragma
  语言符号字符串是给出特有编译器指令和参量的字符序列。数字符号(#)必须是包含编译指示行中的第一个非空白字符。空白字符可分开数字符号(#)和单词pragma。
  作用:
  为了避免同一个文件被include多次
  1 #ifndef方式
  2 #pragma once方式
  在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。
  方式一:
  #ifndef __SOMEFILE_H__
  #define __SOMEFILE_H__
  ... ... // 一些声明语句
  #endif
  方式二:
  #pragma once
  ... ... // 一些声明语句
  #ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况
  #pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
  方式一由语言支持所以移植性好,方式二 可以避免名字冲突
  #pragma once方式产生于#ifndef之后,因此很多人可能甚至没有听说过。目前看来#ifndef更受到推崇。因为#ifndef受语言天生的支持,不受编译器的任何限制;而#pragma once方式却不受一些较老版本的编译器支持,换言之,它的兼容性不够好。也许,再过几年等旧的编译器死绝了,这就不是什么问题了。
  我还看到一种用法是把两者放在一起的:
  #pragma once
  #ifndef __SOMEFILE_H__
  #define __SOMEFILE_H__
  ... ... // 一些声明语句
  #endif
  看起来似乎是想兼有两者的优点。不过只要使用了#ifndef就会有宏名冲突的危险,所以混用两种方法似乎不能带来更多的好处,倒是会让一些不熟悉的人感到困惑。
&&&&&&&&&&
本文已收录于以下专栏:
相关文章推荐
转摘自: /content/10/458_.shtml #pragma once 指令格式如下:#pragma once...
0.形式不同
#ifndef方式:    
#ifndef __FILENAME_H__
#define __FILENAME_H__
... ... // 一些...
在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作。
1. #pragma message 指令
message能够在编译消息输出窗口中输出相...
1.      #pragma once用来防止某个头文件被多次include;     #ifndef,#define,#endif用来防止某个宏被多次定义。 2.    &#1...
#pragma once一般由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。你无法对一个头文件中的一段代码作pragma on...
     #pragma once用来防止某个头文件被多次include;
     #ifndef,#define,#endif用来防止某个宏被多次定义。
 &#160...
     #pragma once用来防止某个头文件被多次include;
     #ifndef,#define,#endif用来防止某个宏被多次定义。
 
...
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文...
.cpp文件是一个编译单元,obj文件是编译的输出文件,链接是将所有地obj文件链接起来组成一个exe。链接过程中如果有不同的cpp文件中包含相同的函数名,变量名(注意不包括变量的引用、函数的声明、以...
昨天去YY公司面试,面试官问了一下问题难住了我,问我#pragmma once与条件编译的区别,这两种方式我都用过,是防止一个头文件被重复include。但是区别,还真的没有认真地去看过。回来查了一下...
他的最新文章
讲师:刘文志
讲师:陈伟
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 c pragma once 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信