初探#pragma

今天老师上课提到了宏定义的用途,抛出一个问题:

#pragma的哪个功能最常见?

我凭借印象回答说是once,老师没点我;在黑板上写下#pragma pack(1),引出struct的内存对齐。

不过凭印象里面,的确是#pragma once比较常见呀,还有去掉warning、链接lib什么的。可能和老师精通嵌入式开发有关

于是在这里整理下#pragma的几种常见用途好了

1.#pragma pack(x)

表示接下来的struct内存对齐以x字节为标准单位(即内存对齐长度不会小于x字节)。使用#pragma pack()来恢复使用默认对齐方式

 

2.#pragma once

加入这个之后,可使头文件在被多次include的情况下只编译一次,避免重复定义等麻烦事;

当然有一个传统的做法是#ifndef xxx -> #define xxx  -> 代码段 -> #endif,用途一样

二者的差异是:

#pragma once编译速度快一些,不用怕想出的宏名冲突,对整个文件有效;

#ifndef支持性更好(特别是非vs编译器上),可针对文件内的部分代码生效

 

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

这里的功能比较多,光是comment-type就可以分为5种:compiler,exestr,lib,linker,user

其中lib用的最多,#pragma comment(lib,"bass.lib") 就把bass.lib加入到工程里了,这样就不需要再从工程配置文件里进行设置

其他的就不多提了,这方面的文章一搜一堆~

 

4.#pragma warning( warning-type , warning-number...)

可以控制编译器的警告输出!比如某个警告一出一大堆你又看着碍眼,就可以利用这个屏蔽掉

warning-type可填once、error、disable、enable、default等,分别对应:显示一次、按错误处理、不显示警告、显示警告、默认设置

warning-number就是警告的代号。当然填法还是多样的,可以几个处理填到一行里,比如:

#pragma warning( disable :  4100 4511 4512 4663 4245 4018 4514)

#pragma warning( disable : 4507; once : 4385; error : 164 )

#prama warning只对所在的头文件、以及包含该头文件的有效

 

其他的一些用法比如显示编译消息的#pragma message()、开发驱动会用到的#pragma code_seg()、引入资源的#pragma resource ,以及一些针对特定编译器的用法,就不多提了

发表评论

电子邮件地址不会被公开。

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>