pragma命令详解_第1页
pragma命令详解_第2页
pragma命令详解_第3页
pragma命令详解_第4页
pragma命令详解_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在所有的预处理指令中 在所有的预处理指令中 pragma pragma 指令可能是最复杂的了 它的作用指令可能是最复杂的了 它的作用 是设定编译器的状态或者是指示编译器完成一些特定的动作 是设定编译器的状态或者是指示编译器完成一些特定的动作 pragma pragma 指令对每个编译器给出了一个方法指令对每个编译器给出了一个方法 在保持与在保持与 C C 和和 C C 语言完语言完 全兼容的情况下全兼容的情况下 给出主机或操作系统专有的特征 给出主机或操作系统专有的特征 依据定义依据定义 编译指示是机器或操作系统专有的编译指示是机器或操作系统专有的 且对于每个编译器都是且对于每个编译器都是 不同的 不同的 其格式一般为其格式一般为 pragma pragma parapara 其中其中 parapara 为参数 下面来看一些常用的参数 为参数 下面来看一些常用的参数 1 message 1 message 参数参数 messagemessage 参数是我最喜欢的一个参数 它能够在编译信息输出窗口参数是我最喜欢的一个参数 它能够在编译信息输出窗口 中输出相应的信息 中输出相应的信息 这对于源代码信息的控制是非常重要的 其使用方法为 这对于源代码信息的控制是非常重要的 其使用方法为 pragma pragma message message 消息文本消息文本 当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出 来 来 当我们在程序中定义了许多宏来控制源代码版本的时候 我们自当我们在程序中定义了许多宏来控制源代码版本的时候 我们自 己有可能都会忘记有没有正确的设置这些宏 己有可能都会忘记有没有正确的设置这些宏 此时我们可以用这条指令在编译的时候就进行检查 假设我们希望判此时我们可以用这条指令在编译的时候就进行检查 假设我们希望判 断自己有没有在源代码的什么地方定义了断自己有没有在源代码的什么地方定义了 X86 X86 这个宏这个宏 可以用下面的方法可以用下面的方法 ifdef ifdef X86 X86 pragma pragma message X86message X86 macromacro activated activated endif endif 我们定义了我们定义了 X86 X86 这个宏以后 应用程序在编译时就会在编译输出这个宏以后 应用程序在编译时就会在编译输出 窗口里显示窗口里显示 86 86 macromacro activated activated 我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了 我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了 2 2 另一个使用得比较多的另一个使用得比较多的 pragmapragma 参数是参数是 code segcode seg 格式如 格式如 pragma pragma code seg code seg section name section name section class section class 它能够设置程序中函数代码存放的代码段 当我们开发驱动程序它能够设置程序中函数代码存放的代码段 当我们开发驱动程序 的时候就会使用到它 的时候就会使用到它 3 pragma 3 pragma onceonce 比较常用比较常用 只要在头文件的最开始加入这条指令就能够保证头文件被编译一只要在头文件的最开始加入这条指令就能够保证头文件被编译一 次 这条指令实际上在次 这条指令实际上在 VC6VC6 中就已经有了 中就已经有了 但是考虑到兼容性并没有太多的使用它 但是考虑到兼容性并没有太多的使用它 4 pragma 4 pragma hdrstophdrstop 表示预编译头文件到此为止 后面的头文件不进行预编译 表示预编译头文件到此为止 后面的头文件不进行预编译 BCBBCB 可可 以预编译头文件以加快链接的速度 以预编译头文件以加快链接的速度 但如果所有头文件都进行预编译又可能占太多磁盘空间 所以使用这但如果所有头文件都进行预编译又可能占太多磁盘空间 所以使用这 个选项排除一些头文件 个选项排除一些头文件 有时单元之间有依赖关系 比如单元有时单元之间有依赖关系 比如单元 A A 依赖单元依赖单元 B B 所以单元 所以单元 B B 要要 先于单元先于单元 A A 编译 编译 你可以用你可以用 pragma pragma startupstartup 指定编译优先级 如果使用了指定编译优先级 如果使用了 pragma pragma package smart init package smart init BCBBCB 就会根据优先级的大小先后编译 就会根据优先级的大小先后编译 5 pragma 5 pragma resourceresource dfm dfm 表示把表示把 dfm dfm 文件中的资源加入工程 文件中的资源加入工程 dfm dfm 中包括窗体中包括窗体 外观的定义 外观的定义 6 pragma 6 pragma warning warning disable disable 45074507 34 34 once once 4385 4385 error error 164164 等价于 等价于 pragma pragma warning warning disable disable 45074507 3434 不显示不显示 45074507 和和 3434 号警告信息号警告信息 pragma pragma warning warning once once 43854385 43854385 号警告信息号警告信息 仅报告一次仅报告一次 pragma pragma warning warning error error 164164 把把 164164 号警告信号警告信 息作为一个错误 息作为一个错误 同时这个同时这个 pragmapragma warningwarning 也支持如下格式 也支持如下格式 pragma pragma warning warning pushpush n n pragma pragma warning warning poppop 这里这里 n n 代表一个警告等级代表一个警告等级 1 4 1 4 pragma pragma warning warning pushpush 保存所有警告信息的现有的警告状态 保存所有警告信息的现有的警告状态 pragma pragma warning warning push push n n 保存所有警告信息的现有的警告状保存所有警告信息的现有的警告状 态 并且把全局警告等级设定为态 并且把全局警告等级设定为 n n pragma pragma warning warning poppop 向栈中弹出最后一个警告信息 在入栈向栈中弹出最后一个警告信息 在入栈 和出栈之间所作的一切改动取消 例如 和出栈之间所作的一切改动取消 例如 pragma pragma warning warning pushpush pragma pragma warning warning disable disable 47054705 pragma pragma warning warning disable disable 47064706 pragma pragma warning warning disable disable 47074707 pragma pragma warning warning poppop 在这段代码的最后 重新保存所有的警告信息在这段代码的最后 重新保存所有的警告信息 包括包括 47054705 47064706 和和 4707 4707 7 pragma 7 pragma comment comment 该指令将一个注释记录放入一个对象文件或可执行文件中 该指令将一个注释记录放入一个对象文件或可执行文件中 常用的常用的 liblib 关键字 可以帮我们连入一个库文件 如 关键字 可以帮我们连入一个库文件 如 pragma pragma comment lib comment lib comctl32 lib comctl32 lib pragma pragma comment lib comment lib vfw32 lib vfw32 lib pragma pragma comment lib comment lib wsock32 lib wsock32 lib 每个编译程序可以用每个编译程序可以用 pragma pragma 指令激活或终止该编译程序支持的一些编指令激活或终止该编译程序支持的一些编 译功能 译功能 例如 对循环优化功能 例如 对循环优化功能 pragma pragma loop opt on loop opt on 激活激活 pragma pragma loop opt off loop opt off 终止终止 有时 程序中会有些函数会使编译器发出你熟知而想忽略的警告 有时 程序中会有些函数会使编译器发出你熟知而想忽略的警告 如如 Parameter Parameter xxxxxx isis nevernever usedused inin functionfunction xxx xxx 可以这样 可以这样 pragma pragma warnwarn 100100 TurnTurn offoff thethe warningwarning messagemessage forfor warningwarning 100 100 intint insert record RECinsert record REC r r functionfunction bodybody pragma pragma warnwarn 100 100 TurnTurn thethe warningwarning messagemessage forfor warningwarning 100 100 backback onon 函数会产生一条有唯一特征码函数会产生一条有唯一特征码 100100 的警告信息 如此可暂时终止该警的警告信息 如此可暂时终止该警 告 告 每个编译器对每个编译器对 pragma pragma 的实现不同 在一个编译器中有效在别的编译器的实现不同 在一个编译器中有效在别的编译器 中几乎无效 可从编译器的文档中查看 中几乎无效 可从编译器的文档中查看 补充补充 pragma pragma packpack 与与 内存对齐问题内存对齐问题 许多实际的计算机系统对基本类型数据在内存中存放的位置有限许多实际的计算机系统对基本类型数据在内存中存放的位置有限 制 它们会要求这些数据的首地址的值是某个数制 它们会要求这些数据的首地址的值是某个数 k k 通常它为通常它为 4 4 或或 8 8 的倍数 这就是所谓的内存对齐 而这个的倍数 这就是所谓的内存对齐 而这个 k k 则被称为则被称为 该数据类型的对齐模数该数据类型的对齐模数 alignment alignment modulus modulus Win32Win32 平台下的微软平台下的微软 C C 编译器编译器 cl exe cl exe forfor 80 x86 80 x86 在默认情况下采在默认情况下采 用如下的对齐规则用如下的对齐规则 任何基本数据类型任何基本数据类型 T T 的对齐模数就是的对齐模数就是 T T 的大小 即的大小 即 sizeof T sizeof T 比 比 如对于如对于 doubledouble 类型类型 8 8 字节字节 就要求该类型数据的地址总是就要求该类型数据的地址总是 8 8 的倍数 而的倍数 而 charchar 类型数据类型数据 1 1 字节字节 则则 可以从任何一个地址开始 可以从任何一个地址开始 LinuxLinux 下的下的 GCCGCC 奉行的是另外一套规则奉行的是另外一套规则 在资料中查得 并未验证 在资料中查得 并未验证 如错误请指正如错误请指正 任何任何 2 2 字节大小字节大小 包括单字节吗包括单字节吗 的数据类型的数据类型 比如比如 short short 的对齐的对齐 模数是模数是 2 2 而其它所有超过 而其它所有超过 2 2 字节的数据类型字节的数据类型 比如比如 long double long double 都以都以 4 4 为对齐模数 为对齐模数 ANSIANSI C C 规定一种结构类型的大小是它所有字段的大小以及字段之规定一种结构类型的大小是它所有字段的大小以及字段之 间或字段尾部的填充区大小之和 间或字段尾部的填充区大小之和 填充区就是为了使结构体字段满足内存对齐要求而额外分配给结构体填充区就是为了使结构体字段满足内存对齐要求而额外分配给结构体 的空间 那么结构体本身有什么对齐要求吗 的空间 那么结构体本身有什么对齐要求吗 有的 有的 ANSIANSI C C 标准规定结构体类型的对齐要求不能比它所有字段中要标准规定结构体类型的对齐要求不能比它所有字段中要 求最严格的那个宽松 可以更严格 求最严格的那个宽松 可以更严格 如何使用如何使用 c c c c 中的对齐选项中的对齐选项 vc6vc6 中的编译选项有中的编译选项有 Zp 1 2 4 8 16 Zp 1 2 4 8 16 Zp1 Zp1 表示以表示以 1 1 字节边界字节边界 对齐 相应的 对齐 相应的 Zpn Zpn 表示以表示以 n n 字节边界对齐 字节边界对齐 n n 字节边界对齐的意思是说 一个成员的地址必须安排在成员的尺寸的字节边界对齐的意思是说 一个成员的地址必须安排在成员的尺寸的 整数倍地址上或者是整数倍地址上或者是 n n 的整数倍地址上 取它们中的最小值 的整数倍地址上 取它们中的最小值 也就是 也就是 minmin sizeofsizeof membermember n n 实际上 实际上 1 1 字节边界对齐也就表示了结构成员之间没有空洞 字节边界对齐也就表示了结构成员之间没有空洞 Zpn Zpn 选项是应用于整个工程的 影响所有的参与编译的结构 选项是应用于整个工程的 影响所有的参与编译的结构 要使用这个选项 可以在要使用这个选项 可以在 vc6vc6 中打开工程属性页 中打开工程属性页 c c c c 页 选择页 选择 CodeCode GenerationGeneration 分类 在分类 在 StructStruct membermember alignmentalignment 可以选择 可以选择 要专门针对某些结构定义使用对齐选项 可以使用要专门针对某些结构定义使用对齐选项 可以使用 pragma pragma packpack 编译指令编译指令 1 1 pragma pragma pack pack n n 该指令指定结构和联合成员的紧凑对齐 而一个完整的转换单元该指令指定结构和联合成员的紧凑对齐 而一个完整的转换单元 的结构和联合的紧凑对齐由的结构和联合的紧凑对齐由 Zp Zp 选项设置 选项设置 紧凑对齐用紧凑对齐用 packpack 编译指示在数据说明层设置 该编译指示在其出现后编译指示在数据说明层设置 该编译指示在其出现后 的第一个结构或联合说明处生效 的第一个结构或联合说明处生效 该编译指示对定义无效 该编译指示对定义无效 当你使用当你使用 pragma pragma packpack n n 时时 这里这里 n n 为为 1 1 2 2 4 4 8 8 或或 1616 第一个结构成员之后的每个结构成员都被存储在更小的成员类型第一个结构成员之后的每个结构成员都被存储在更小的成员类型 或或 n n 字节界限内 字节界限内 如果你使用无参量的如果你使用无参量的 pragma pragma pack pack 结构成员被紧凑为以结构成员被紧凑为以 Zp Zp 指定的指定的 值 该缺省值 该缺省 Zp Zp 紧凑值为紧凑值为 Zp8 Zp8 2 2 编译器也支持以下增强型语法编译器也支持以下增强型语法 pragma pragma pack pack pushpush poppop identifier identifier n n 若不同的组件使用若不同的组件使用 packpack 编译指示指定不同的紧凑对齐编译指示指定不同的紧凑对齐 这个语法这个语法 允许你把程序组件组合为一个单独的转换单元 允许你把程序组件组合为一个单独的转换单元 带带 pushpush 参量的参量的 packpack 编译指示的每次出现将当前的紧凑对齐存储到一编译指示的每次出现将当前的紧凑对齐存储到一 个内部编译器堆栈中 个内部编译器堆栈中 编译指示的参量表从左到右读取 如果你使用编译指示的参量表从左到右读取 如果你使用 push push 则当前紧凑则当前紧凑 值被存储起来值被存储起来 如果你给出一个如果你给出一个 n n 的值的值 该值将成为新的紧凑值 若你指定一个标识该值将成为新的紧凑值 若你指定一个标识 符符 即你选定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论