CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  新手乐园

#pragma once 和 #ifndef #define ...#endif 有什么不同?

楼主zsh_333(诸神的曙光)2006-03-17 20:54:57 在 C/C++ / 新手乐园 提问

在.h文件里经常有这两种用法,想问下它们有什么不同吗?或者是什么时候该用哪个呢? 问题点数:50、回复次数:6Top

1 楼ugg(逸学堂(exuetang.net))回复于 2006-03-17 21:11:48 得分 10

#pragma   once  
  这个是编译相关,就是说在这个编译系统上能用,但是在其他编译系统  
  不一定型,也就是说移植型差。不过现在基本上已经是每个编译器  
  都有这个定义了  
   
  #ifndef   #define   ...#endif  
  这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件  
  多次编译。所以在所有支持C++语言的编译器上都是有效的。如果写的程序要  
  跨平台,最好使用这种方式。Top

2 楼ykzhujiang(朱朱)回复于 2006-03-18 05:05:45 得分 5

1.编译器相关指令  
  2.语言支持指令Top

3 楼jixingzhong(瞌睡虫·星辰)回复于 2006-03-18 11:51:49 得分 10

#pragma   once  
  能够保证头文件被编译一次  
   
  #ifndef   #define   ...#endif    
  可以实现   头文件的一次包含  
  但是还可以实现其他的功能     ....  
   
  就头见包含这个方面来说,  
  两者功能差不多   ...Top

4 楼rtm(樾阁)回复于 2006-03-18 12:14:52 得分 5

#ifndef   #define   ...#endif  
  这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件  
  多次编译。所以在所有支持C++语言的编译器上都是有效的。如果写的程序要  
  跨平台,最好使用这种方式。  
   
  ---------------------------  
  在C语言里也是可以用的.Top

5 楼fiftymetre(50米深蓝)回复于 2006-03-18 14:20:41 得分 20

解析#pragma指令    
  在所有的预处理指令中,#Pragma   指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。    
  其格式一般为:   #Pragma   Para    
  其中Para   为参数,下面来看一些常用的参数。    
   
  (1)message   参数。   Message   参数是我最喜欢的一个参数,它能够在编译信息输出窗    
  口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:    
  #Pragma   message(“消息文本”)    
  当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。    
  当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法    
  #ifdef   _X86    
  #Pragma   message(“_X86   macro   activated!”)    
  #endif    
  当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_    
  X86   macro   activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了    
  。    
   
  (2)另一个使用得比较多的pragma参数是code_seg。格式如:    
  #pragma   code_seg(   ["section-name"[,"section-class"]   ]   )    
  它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。    
   
  (3)#pragma   once   (比较常用)    
  只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。    
   
  (4)#pragma   hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。    
  有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma   startup指定编译优先级,如果使用了#pragma   package(smart_init)   ,BCB就会根据优先级的大小先后编译。    
   
  (5)#pragma   resource   "*.dfm"表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体    
  外观的定义。    
   
  (6)#pragma   warning(   disable   :   4507   34;   once   :   4385;   error   :   164   )    
  等价于:    
  #pragma   warning(disable:4507   34)   //   不显示4507和34号警告信息    
  #pragma   warning(once:4385)   //   4385号警告信息仅报告一次    
  #pragma   warning(error:164)   //   把164号警告信息作为一个错误。    
  同时这个pragma   warning   也支持如下格式:    
  #pragma   warning(   push   [   ,n   ]   )    
  #pragma   warning(   pop   )    
  这里n代表一个警告等级(1---4)。    
  #pragma   warning(   push   )保存所有警告信息的现有的警告状态。    
  #pragma   warning(   push,   n)保存所有警告信息的现有的警告状态,并且把全局警告    
  等级设定为n。    
  #pragma   warning(   pop   )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的    
  一切改动取消。例如:    
  #pragma   warning(   push   )    
  #pragma   warning(   disable   :   4705   )    
  #pragma   warning(   disable   :   4706   )    
  #pragma   warning(   disable   :   4707   )    
  //.......    
  #pragma   warning(   pop   )    
  在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。    
  (7)pragma   comment(...)    
  该指令将一个注释记录放入一个对象文件或可执行文件中。    
  常用的lib关键字,可以帮我们连入一个库文件。  
   
  (8)#pragma   pack()    
  我们知道在VC中,对于想结构体Struct这样的类型,VC采用8字节对齐的方式,如果我们不想使用8字节对齐(在网络变成中经常需要这样),我们可以在结构体前面加上    
  #pragma   pack(1)    
  struct    
  {    
  ......    
  }    
  #pragma   pack()    
   
  Top

6 楼zsh_333(诸神的曙光)回复于 2006-03-18 19:51:32 得分 0

谢谢楼上诸位了!Top

相关问题

  • 关于#ifndef#define#endif,
  • #ifndef/#endif 与 #pragma once 区别在那里?
  • 关于#ifndef #define #endif的问题
  • 关于#ifndef #define #endif的问题
  • #ifndef _PortClass_HPP_ define _PortClass_HPP #endif 是什么意思?
  • 问一个关于#ifndef#define#endif的问题
  • 请问:#ifndef #define #endif结构是什么意思?
  • 谁知道#ifndef 和#if !define 的区别?
  • #if _MSC_VER > 1000 #pragma once #endif 这三行代码谁解释一下?
  • 那位大虾告诉我#ifndef 和 #if !define 有什么区别

关键词

  • 编译
  • 编译器
  • 指令
  • 文件
  • 语言
  • 源代码
  • 代码
  • 信息
  • pragma
  • 警告

得分解答快速导航

  • 帖主:zsh_333
  • ugg
  • ykzhujiang
  • jixingzhong
  • rtm
  • fiftymetre

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo