#pragma详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/good123day/article/details/8515590
#pragma详解:


#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作。
1. #pragma once 在头文件的最开始加入这条指令就能够保证头文件被编译一次。

#pragma once用来防止某个头文件被多次include;与编译器有关系,目前一般编译器都支持该方法了。
#ifndef,#define,#endif用来防止某个宏被多次定义。如果宏名称相同了,则不同的文件内容也不能同时存在了,这个需要注意。

2. #pragma warning 允许有选择性的修改编译器的警告消息的行为。
   #pragma warning( push ) ;       //保存所有警告信息的现有的警告状态。
#pragma warning( disable : 4705 ) //禁用4705警告输出。 
#pragma warning( pop )            //恢复所有所有警告信息的现有的警告状态。
#pragma warning( push [ ,n ] )    保存所有警告信息的现有的警告状态,并将改为N级别
once:只显示一次(警告/错误等)消息 
default:重置编译器的警告行为到默认状态 
1,2,3,4:四个警告级别 
disable:禁止指定的警告信息 
error:将指定的警告信息作为错误报告 

3. pragma comment( "comment-type" [, commentstring]) //将一个注释记录放入一个对象文件或可执行文件中, 
comment-type(注释类型):可以指定为五种预定义的标识符的其中一种 
五种预定义的标识符为: 

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

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

lib: 用来将一个库文件链接到目标文件中 
例如:  #pragma comment(lib, "user32.lib") //该指令用来将user32.lib库文件加入到本工程中 

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

user:将一般的注释信息放入目标文件中commentstring参数包含注释的文本信息,这个注释记录将被链接器忽略 
  例如: #pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ ) 


4. #pragma message(“消息文本”)


5. #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" (可选参数) 表示函数存放的节名 
 

猜你喜欢

转载自blog.csdn.net/good123day/article/details/8515590
今日推荐