`
conkeyn
  • 浏览: 1523460 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

解析#pragma指令

 
阅读更多
   在所有的预处理指令中,#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关键字,可以帮我们连入一个库文件。
分享到:
评论

相关推荐

    #pragma 预处理指令详解.pdf

    本文将详细解析#pragma指令的功能、格式及其应用场景,以便开发者能够充分利用这一特性。 #### #pragma指令简介 #pragma指令允许开发者向编译器发送非标准的、编译器特定的命令,这些命令可以改变编译器的行为或...

    #pragma指令用法汇总和解析

    ### #pragma 指令用法汇总与解析 在 C++ 编程中,`#pragma` 是一种预处理器指令,用于向编译器提供非标准的信息或指示。`#pragma` 不是语言的一部分,而是编译器扩展,主要用于控制编译器的行为,例如调整警告级别...

    #pragma用法大全.doc

    在 `#pragma` 后面可以写入编译器能够识别的任何文本,这些文本会被预处理器解析并执行相应的操作。需要注意的是,`#pragma` 指令中的参数可能会受到宏替换的影响。 #### 三、常见用法 下面是一些常见的 `#pragma`...

    #pragma_命令集合.pdf

    ### #pragma 命令集合解析 在编程领域中,`#pragma` 是一个非常有用的预处理器指令,它允许程序员直接向编译器传递特定的信息或控制编译过程中的某些特性。下面,我们将深入探讨几个常见的 `#pragma` 指令,并详细...

    预处理指令#pragma讲解

    ### 预处理指令 #pragma 的深入解析 在C/C++编程中,预处理指令(Preprocessor Directives)是编译前的一种特殊机制,用于控制编译器的行为。其中,`#pragma` 是一种非常强大的预处理指令,它可以用来设置编译器的...

    pragma_comment用法

    pragma_comment 是一种预处理指令,用于在编译器、链接器和可执行文件中插入注释信息。它的基本语法为 `#pragma comment(comment-type [,"commentstring"])`,其中 `comment-type` 是一个预定义的标识符,指定注释的...

    C#预处理指令之#line,#pragma warning 详细解析

    在这篇文章中,我们将详细解析两种预处理指令:`#line`和`#pragma warning`。 `#line`指令允许程序员在编译期间改变源代码的行号和文件名信息。这在某些情况下非常有用,比如当源代码经过自动化工具处理,导致原始...

    预处理指令详解等资料整理

    这个指令提高了编译效率,避免了多次解析同一头文件的时间浪费。 `#pragma hdrstop`则用于控制预编译头文件的范围。预编译头文件(如`stdafx.h`)可以加速编译过程,但过多的预编译可能会占用大量磁盘空间。`#...

    keil 错误 C51编译器鉴别错类型

    - **解析预处理指令**(*PARSINGINVOKE-/#PRAGMA_LINE*):当预处理器遇到#pragma指令但无法正确解析时。 - **内存分配**(*ALLOCATINGMEMORY*):在编译时如果内存需求超过系统限制(如512K),会导致编译失败。 - ...

    msp430函数定位方法

    2. 使用`#pragma constseg`或`#pragma dataseg`指令在C代码中指定段名,以定位特定的程序或变量。 3. 使用`#pragma default`指令恢复编译器的默认定位策略,以确保后续的变量和函数按照默认规则分配。 ### 应用...

    OpenMP Intro

    ### OpenMP简介与核心知识点解析 #### 一、OpenMP概述 **OpenMP**(Open Multi-Processing)是一种用于共享内存多处理器环境的并行编程模型。它通过提供一组指令来指导编译器如何并行执行代码,从而简化了并行编程...

    temp source

    根据给定的信息,我们可以深入探讨结构体在不同编译器设置下的内存对齐与...在实际开发过程中,合理地使用`#pragma pack`指令或`__attribute__((__packed__))`属性可以有效地控制内存布局,从而实现更高效的内存使用。

    IAR的一些扩展关键字

    以下是对IAR扩展关键字的详细解析,旨在帮助开发者更有效地编写和管理代码。 ### 控制数据和指针的扩展关键字 #### 1. 数据存储空间控制关键字 - **`__eeprom`**:此关键字用于将数据放置在EEPROM存储空间中,这是...

    parallel-computing-openacc-源码.rar

    - **Directives(指令)**:OpenACC的指令以`#pragma acc`开头,用于指示编译器如何处理特定的代码块。例如,`#pragma acc parallel`用于创建并行区域,`#pragma acc kernels`用于指定内联汇编,以及`#pragma acc ...

    Examples-4.5.0.zip

    《OpenMP 4.5实例解析与应用指南》 OpenMP(Open Multi-Processing)是一种并行编程模型,主要用于共享内存多处理器系统。OpenMP API提供了丰富的编程接口,使得程序员可以方便地在C、C++和Fortran等语言中实现并行...

    DebugMacroDemo.zip

    3. 编译项目,观察编译输出窗口,你会看到 `#pragma message` 指令打印出的信息,这些信息揭示了 `DEBUG` 宏在各个源文件中的状态。 4. 可以尝试修改 `DEBUG` 宏的定义,再次编译,查看输出信息的变化,以理解不同...

Global site tag (gtag.js) - Google Analytics