几何尺寸与公差论坛

 找回密码
 注册
查看: 2602|回复: 3

#pragma的具体用法,简明一点!

[复制链接]
发表于 2007-3-27 12:32:24 | 显示全部楼层 |阅读模式
一个常用方法:用于包含一个输入库:   
      #pragma   comment(lib,"advapi32.lib")
 楼主| 发表于 2007-3-27 12:37:17 | 显示全部楼层

回复: #pragma的具体用法,简明一点!

#ifndef/#endif 与 #pragma once 区别在那里?
有不同~   
  vc将作如下处理:   
   
  #ifndef   
  #define   
  。。。。。。   
  #endif   
   
  他读到#ifndef之后,如果已经定义过了,就会跳过这一大片,一直到#endif为止。这将增加build时间,因为每次compiler都会打开这个文件,然后搜索全文件一遍   
   
  而如果碰到了#pragma   once,他就会立刻停止,关闭打开的这个文件。在某种程度上减少了build时间。   
   
  一般用法   
  #ifndef   
  #define   
  #pragma   once   
  .....   
  #endif
 楼主| 发表于 2007-3-27 12:38:29 | 显示全部楼层

回复: #pragma的具体用法,简明一点!

#pragma   once   
1.编译器相关指令  
  这个是编译相关,就是说在这个编译系统上能用,但是在其他编译系统   
  不一定型,也就是说移植型差。不过现在基本上已经是每个编译器   
  都有这个定义了   

   
  #ifndef   #define   ...#endif   
  2.语言支持指令
  这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件   
  多次编译。所以在所有支持C++语言的编译器上都是有效的。如果写的程序要   
  跨平台,最好使用这种方式。
 楼主| 发表于 2007-3-27 12:42:00 | 显示全部楼层

回复: #pragma的具体用法,简明一点!

解析#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()
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-5-10 23:11 , Processed in 0.037323 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表