今天老师上课提到了宏定义的用途,抛出一个问题:
#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 ,以及一些针对特定编译器的用法,就不多提了