关于pragma命令的使用

newBarry 2007-06-09 04:10:40
各位好!小弟今天在看代码时发现有如下语句:

#pragma warning(disable: 4786)

使用的课本没有介绍关于这方面的知识,上网又还没找到详细的解释,所以想来请高手们解答一下.

请问:
1.C++中的pragma命令有什么用?(请详细介绍)
2.warning4786指什么?常见的warning有哪些?

望答复,谢谢~
...全文
162 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dai_weitao 2007-06-09
  • 打赏
  • 举报
回复
微软VS的预处理命令.
分为好多种.
查MSDN
星羽 2007-06-09
  • 打赏
  • 举报
回复
在所有的预处理指令中,#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关键字,可以帮我们连入一个库文件。
星羽 2007-06-09
  • 打赏
  • 举报
回复
在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
&W?J*o'Fx法易居(av5.cn)#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。www.av5.cnx],r5s/V^
依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 *r'g+c;c+r8T*C
其格式一般为: #pragma para (B5za/l n{2g7Wm
其中para为参数,下面来看一些常用的参数。 Im{Ol9o[}
(1)message 参数
w(I
tl4S%f \~ize法易居(av5.cn) message参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,
:afJ?7v!r(Xow这对于源代码信息的控制是非常重要的。其使用方法为: 法易居(av5.cn)J:Ux)`-|1A~n
#pragma message("消息文本") +v{RK$D7]S
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。 法易居(av5.cn)W2yOd,V-s{]V
当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,o U"Km.R H {
此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏,#us/l1dL4E.y"B
可以用下面的方法:3N"cm2Y$c2VQY4b([F j
#ifdef _X86
)@
c
rqJ_K法易居(av5.cn) #pragma message("_X86 macro activated!")
A.p!Hx}e$?5G.JP| #endif 法易居(av5.cn)zS/x3b5|ty6V
我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示"_86 macro activated!"。:y"i&NE{/?I$c6i#`
我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。 www.av5.cn+\6Ibz6y(F Bw

,N\2iN%P2q'N(k(2)另一个使用得比较多的pragma参数是code_segIeXE8tLV+F v
格式如: 0A O;B&dzT/n1`3O
#pragma code_seg( ["section-name" [, "section-class"] ] )
1Hil(YJ5vtm-P 它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。
(IVV K9{cHk2u

F*\-^&A @HY,c,?w(3)#pragma once (比较常用) 法易居(av5.cn)o&cU,i7u~2gC
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,
2?r$?9v;{,k但是考虑到兼容性并没有太多的使用它。
8f9I8DxKh2rw
.@J6loxY法易居(av5.cn)(4)#pragma hdrstop
B LNX)zkzi)p法易居(av5.cn) 表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,
]h1Jb(e8R&o但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。 'n/QI;N~
有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。
&k9O!y3{8g"J E/^你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init),6p|2h1ww`7O,_
BCB就会根据优先级的大小先后编译。
u:]j4\ Dz%?o5WS www.av5.cn+j(z+w
V)F)N)Z
(5)#pragma resource "*.dfm"
/wy6h8F]KG1uP 表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体
6|7~u!qYB2mh7Iwww.av5.cn外观的定义。 $z.A9f.U1rIt0tM

Z9vs9o2]+z-H ?7_法易居(av5.cn)(6)#pragma warning( disable: 4507 34; once: 4385; error: 164 )www.av5.cn
fX%a,A_'_+hc`S(v

:JK'h(wV0RJi3?/Ah&Q 等价于: {1}
n\W
#pragma warning( disable: 4507 34 ) // 不显示4507和34号警告信息
-{)F8l.e L{Aswww.av5.cn #pragma warning( once: 4385 ) // 4385号警告信息仅报告一次
Ima0H#mZe法易居(av5.cn) #pragma warning( error: 164 ) // 把164号警告信息作为一个错误。
D1O*T9Y9R:[^$D 同时这个pragma warning 也支持如下格式:
a8tA]!NQ'pC3d #pragma warning( push [, n ] )
(P!N(u&U"[/ML0b #pragma warning( pop )
.mv\+Q&c {
v 这里n代表一个警告等级(1---4)。 9h
g;ht'CQI
vK!C
#pragma warning( push )保存所有警告信息的现有的警告状态。
l1G9szYKwww.av5.cn #pragma warning( push, n )保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n。
#B,PS-K%m1nwww.av5.cn #pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。例如:
'n;sl7@P o #pragma warning( push ) SdWbKmK
#pragma warning( disable: 4705 ) R$^^5A#} es8p)_
#pragma warning( disable: 4706 )
;j"R$Fz~"g #pragma warning( disable: 4707 ) ,PlP|f r
//.......
E*xah%[m)JG$^-_ #pragma warning( pop )
(Qo{-LRNbwww.av5.cn 在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。
F
b^6_qu6?W
]*qI{3V,F,R0@(7)#pragma comment(...) !a(kQ7W%A5C:e
该指令将一个注释记录放入一个对象文件或可执行文件中。 QnTB:tW4G(~
常用的lib关键字,可以帮我们连入一个库文件。如:#w,g)l^b Sl
#pragma comment(lib, "comctl32.lib")
T!d4Y6kn_www.av5.cn #pragma comment(lib, "vfw32.lib"):u$}]'["^!j"n{-K?9A(q
#pragma comment(lib, "wsock32.lib")Z6?`2m:q
gracefullee 2007-06-09
  • 打赏
  • 举报
回复
建议你查一下MSDN
#pragma就类似于命令行指令
比如:
#pragma warning(disable: 4786)指的是使警告信息4786失效
至于4786,也可以直接在MSDN中搜索到,具体自己去MSDN看
因为如果这个你也需要问的话,那就没完没了啦,因为警告信息、错误信息,加起来有几前条
你找个猛人给你一条一条解释吧。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧