整理日:2015年3月12日 资源来来自己网络

在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作.

下面介绍了一下该指令的一些常用参数,希望对大家有所帮助!

1. message参数

message它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:

#pragma message(“消息文本”)

当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。

当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法

#ifdef _X86
#pragma message(“_X86 macro activated!”)
#endif

当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了

2. code_seg参数

使用得比较多的#pragma参数, 格式如:

#pragma code_seg( [ [ { push | pop}, ] [ identifier, ] ] [ "segment-name" [, "segment-class" ] )

该指令用来指定函数在.obj文件中存放的节,观察OBJ文件可以使用VC自带的dumpbin命令行程序,函数在.obj文件中默认的存放节为.text节,

如果code_seg没有带参数的话,则函数存放在.text节中

push : (可选参数)将一个记录放到内部编译器的堆栈中,可选参数可以为一个标识符或者节名

pop : (可选参数)将一个记录从堆栈顶端弹出,该记录可以为一个标识符或者节名

identifier : (可选参数)当使用push指令时,为压入堆栈的记录指派的一个标识符,当该标识符被删除的时候和其相关的堆栈中的记录将被弹出堆栈

"segment-name" : (可选参数)表示函数存放的节名

例如:

// 默认情况下,函数被存放在.text节中
// stored in .text
void func1() {
} // 将函数存放在.my_data1节中
#pragma code_seg(".my_data1")
// stored in my_data1
void func2() {
} // r1为标识符,将函数放入.my_data2节中
#pragma code_seg(push, r1, ".my_data2")
void func3() // stored in my_data2
{ } int main() {
}

3. #pragma once参数

是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次

4. #pragma hdrstop

表示预编译头文件到此为止,后面的头文件不进行预编译。

CB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。

有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。

5. #pragma warning指令

该指令允许有选择性的修改编译器的警告消息的行为指令格式如下:

#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...]
#pragma warning( push[ ,n ] )
#pragma warning( pop )

主要用到的警告表示有如下几个:

once : 只显示一次(警告/错误等)消息

default : 重置编译器的警告行为到默认状态

1,2,3,4 : 四个警告级别

disable : 禁止指定的警告信息

error : 将指定的警告信息作为错误报告

如果大家对上面的解释不是很理解,可以参考一下下面的例子及说明


#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)

在使用标准C++进行编程的时候经常会得到很多的警告信息,而这些警告信息都是不必要的提示,

所以我们可以使用#pragma warning(disable:4786)来禁止该类型的警告

在vc中使用ADO的时候也会得到不必要的警告信息,这个时候我们可以通过

#pragma warning(disable : 4146)

来消除该类型的警告信息

6. pragma comment(...)

该指令的格式为

#pragma comment( "comment-type" [, commentstring] )

该指令将一个注释记录放入一个对象文件或可执行文件中,

comment-type(注释类型):可以指定为五种预定义的标识符的其中一种

五种预定义的标识符为:

1) compiler

将编译器的版本号和名称放入目标文件中,本条注释记录将被编译器忽略, 如果你为该记录类型提供了commentstring参数,编译器将会产生一个警告, 例如:

#pragma comment( compiler )

2) exestr

将commentstring参数放入目标文件中,在链接的时候这个字符串将被放入到可执行文件中,当操作系统加载可执行文件的时候,该参数字符串不会被加载到内存中.但是,该字符串可以被dumpbin之类的程序查找出并打印出来,你可以用这个标识符将版本号码之类的信息嵌入到可执行文件中!

3) lib

这是一个非常常用的关键字,用来将一个库文件链接到目标文件中

常用的lib关键字,可以帮我们连入一个库文件。

例如:

#pragma comment(lib, "user32.lib")

该指令用来将user32.lib库文件加入到本工程中

4) linker

将一个链接选项放入目标文件中,你可以使用这个指令来代替由命令行传入的或者在开发环境中设置的链接选项,你可以指定/include选项来强制包含某个对象, 例如:

#pragma comment(linker, "/include:__mySymbol")

你可以在程序中设置下列链接选项

/DEFAULTLIB

/EXPORT

/INCLUDE

/MERGE

/SECTION

这些选项在这里就不一一说明了,详细信息请看msdn!

5) user

将一般的注释信息放入目标文件中commentstring参数包含注释的文本信息,这个注释记录将被链接器忽略, 例如:

#pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ )

上面所说的#pragma指令并没有包含所有的参数说明,本人只是提供了一些相对来说比较常用的参数,有不当的地方还请大家指点!

pragma指令简介的更多相关文章

  1. 14.C#属性访问器、命名空间、pragma指令(七章7.3-7.5)

    看到一些零星的知识片,今天就用自己的理解说明下,也是因为太简单了,一下就过的,也是我们日常开发中常用.留下一个脚印,当书不在手上的,也能翻出来看看.说下属性访问器.命名空间和pragma指令. 属性访 ...

  2. angularjs学习第六天笔记(指令简介学习)

    您好,由于周末有事情,没哟学习angularjs,几天晚上开始继续学习angularjs,坚持加油每一天.谢谢 接着上周五学习了表单验证以后,今天开始学习angularjs中一个非常重要的模块:指令 ...

  3. 3.6 MIPS指令简介

    计算机组成 3 指令系统体系结构 3.6 MIPS指令简介 MIPS秉承着指令数量少,指令功能简单的设计理念.那这样的设计理念是如何实现的呢?在这一节,我们就将来分析MIPS指令的特点. 相比于X86 ...

  4. 3.3 x86指令简介

    计算机组成 3 指令系统体系结构 3.3 x86指令简介 x86指令种类繁多,数量庞大.在这一节我们将会学习x86指令的分类,并分析其中最为基础的一部分指令. 通常一个指令系统主要包括这几类指令.运算 ...

  5. pragma指令详解(转载)

    #pragma comment( comment-type [,"commentstring"] ) 该宏放置一个注释到对象文件或者可执行文件.comment-type是一个预定义 ...

  6. msvc/gcc:中用#pragma指令关闭特定警告(warning)

    在使用一些第三方库或源码的时候,经常会遇到编译时产生warnings情况,这些warning不是我们自己的代码产生的,当然也不好去修改,但每次编译都显示一大堆与自己代码无关的警告也着实看着不爽,更麻烦 ...

  7. 8086cpu-intel汇编指令简介

    jcxz   有条件跳转指令,cx为跳转条件.如果(cx)==0则跳转到指定标号处.跳转地址在机器码中已相对位置(-128~127)给出. 相当于                if((cx)==0) ...

  8. Redis系统管理相关指令简介

    常用命令列表 DBSIZE                                            返回当前数据库 Key 的数量 INFO                       ...

  9. javaee学习-JSP指令简介

    JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: page指令 Inclu ...

随机推荐

  1. C#验证邮件

    public static bool IsEmail(string email) { String strExp = @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+( ...

  2. 经典SQL语句大全之数据开发

    数据开发 1.按姓氏笔画排序:Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多 ...

  3. [D3] 11. Basic D3 chart interactivity on(), select(this), classed(class, trueorfalse)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. jQuery--对话框插件--dialog

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. HDU2054JAVA

    (包括2016级新生)除了校赛,还有什么途径可以申请加入ACM校队? A == B ? Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: ...

  6. JS获取URL的参数

    function request(paras) { var url = location.href; , url.length).split("&"); var paraO ...

  7. (转)Spring读书笔记-----Spring核心机制:依赖注入

    Java应用(从applets的小范围到全套n层服务端企业应用)是一种典型的依赖型应用,它就是由一些互相适当地协作的对象构成的.因此,我们说这些对象间存在依赖关系.加入A组件调用了B组件的方法,我们就 ...

  8. 2013年10月13日学习:SQL通过图形化界面创建表

    通过SQL2005创建表的方式有两种: 1.通过图形化用户界面来创建表.比较容易出问题,不稳定,容易点错了.不推荐 2.通过命令来创建.大牛都是这样做的,比较好. 通过图形化界面创建:以创建员工表为例 ...

  9. spring 的 PropertyPlaceholderConfigurer读取的属性怎么访问 (java访问方式,不是xml中的占位符哦)及此类的应用

    一.1.占位符的应用:(@Autowired注解方式,不需要建立set与get方法了,xml注入也不需要写了) http://www.cnblogs.com/susuyu/archive/2012/0 ...

  10. java中事件处理探究

    事件的触发可以源于用户,也可以用代码来主动设置事件的发生.如setSelected()java.awt.event中 听众接口 事件类 适配器类 ComponentListener     Conta ...