`
Riddick
  • 浏览: 642034 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

预编译指令与相关宏小结

阅读更多

1.预编译指令

01) #
  空指令,无任何效果

02) #include     
  包含一个源代码文件

03) #define
  定义宏
 
04) #undef
  取消已定义的宏

05) #if
  如果给定条件为真,则编译下面代码
 
06) #else                                  
   作为其他预处理的剩余选项进行编译

07) #ifdef
  如果宏已经定义,则编译下面代码

08) #ifndef
  如果宏没有定义,则编译下面代码

09) #elif
  如果前面的#if给定条件不为真,当前条件为真,则编译下面代码

10) #endif
  结束一个#if……#else条件编译块
 
11) #line
  改变当前的行数和文件名称
 
12) #pragma
  为编译程序提供非常规的控制流信息

13) #error
  停止编译并显示错误信息
 
 
 
 
 
2.与编译器相关的宏

    文中只列出部分相关宏,如果想查看完整的宏列表,可参考MSDN的"Predefined Macros"一节

01) _MSC_VER
    Microsoft 编译器的版本宏.   
    各版本编译器相应的数值如下表所示:
   
        Compiler                               _MSC_VER value
   --------------------                    -----------------------
   C Compiler version 6.0                          600
   C/C++ compiler version 7.0                      700
   Visual C++, Windows, version 1.0                800
   Visual C++, 32-bit, version 1.0                 800
   Visual C++, Windows, version 2.0                900
   Visual C++, 32-bit, version 2.x                 900
   Visual C++, 32-bit, version 4.0                 1000
   Visual C++, 32-bit, version 5.0                 1100
   Visual C++, 32-bit, version 6.0                 1200
   Visual C++, 32-bit, version 2002                1300
   Visual C++, 32-bit, version 2003                1310
   Visual C++, 32-bit, version 2005                1400
   Embedded Visual C++, 32-bit,version 4.0        Cross 1200 - 1202
     
  
02) _MFC_VER
    MFC版本宏.
       
       Version                        _MFC_VER value
    --------------                  -----------------
        4.21                             0x0421
        6.0                              0x0600
        7.0                              0x0700


03) __TIME__
    编译当前源文件的时间,格式为 "hh:mm:ss" 样式的字符串.
   

04) __DATE__
     编译当前源文件的日期,格式为 "Mmm dd yyyy" 样式的字符串.
    
         
05) __FILE__
    编译的当前源文件名.   
   
   
 
 
   
3.实例解说
 
01) 根据_MFC_VER值判断当前的编译环境.
    #if _MSC_VER >= 1400
       // this is Visual C++ 2005
    #elif _MSC_VER >= 1310
       // this is Visual c++ .NET 2003
    #elif _MSC_VER > 1300
       // this is Visual C++ .NET 2002
    #endif
 
   
02) #else if 和 #elif 的细微差别
    #if _MSC_VER < 1202
      //EVC 4.0 complier is cross 1200 - 1202
    #else if _MSC_VER >= 1400
      //Visual C++ 2005 complier is 1400
    #else
      //Visual C++ 2005 complier is 1400
    #endif
   
    这段预编译代码在Evc4.0和visual studio 2005中编译会出错,提示错误为"unexpected #else".此时只要将"#else if"置换成"#elif"即可:
   
    #if _MSC_VER < 1202
      //EVC 4.0 complier is cross 1200 - 1202
    #elif _MSC_VER >= 1400
      //Visual C++ 2005 complier is 1400
    #else
      //Visual C++ 2005 complier is 1400
    #endif
   
    上面代码可以顺利编译通过.
   

03) 包含上级目录的某个头文件
    如果当前文件需要包含上级目录的某个头文件,可采用"..\\"形式,比如:
    #include "..\\Configure.h"
   
    甚至还可以层层递推,定位于上上级目录:
    #include "..\\..\\Configure.h"
   
   
04) 包含当前目录的某个文件夹下的头文件
    如果当前文件需要包含当前目录下的某个文件夹中的某个头文件,可采用".\\"形式,比如:
    #include ".\\Include\\Configure.h"
   
   
05) 判断当前CPU类型
 #ifdef _X86_
    //x86
 #endif

 #ifdef _MIPS_
   //mips

#endif

分享到:
评论

相关推荐

    预编译资料 预编译资料

    预编译过程发生在源代码编译之前,它通过一系列预编译指令来完成特定任务。这些指令通常以`#`符号开始,例如`#define`、`#include`等。预编译的具体流程可以总结如下: 1. **源程序文件**:源代码以`.C`扩展名保存...

    Keil_C使用经验小结

    - **编译与链接控制**:编译时需要正确配置宏定义、预处理器指令等,以避免编译错误。 #### 八、编译与链接控制 为了更好地控制编译过程,Keil C提供了多种机制: - **编译时控制**:通过预处理器指令(如`#ifdef...

    大学汇编语言教程 已编译的 HTML 帮助文件 的格式

     9.3 与宏有关的伪指令  1 局部标号伪指令  2 取消宏定义伪指令  3 中止宏扩展伪指令  9.4 重复汇编伪指令  1 伪指令REPT  2 伪指令IRP  3 伪指令IRPC  9.5 条件汇编伪指令  1 条件汇编伪指令的功能 ...

    关于的Uc小结

    条件编译指令 - `#if`:条件编译开始标记。 - `#elif`:在`#if`之后,当上一个条件不满足时尝试此条件。 - `#else`:当`#if`和所有`#elif`条件都不满足时执行。 - `#endif`:结束条件编译。 #### 2. 错误处理指令 ...

    第1章知识点小结和常见错误小结1

    宏常量是一种预处理器指令,通过#define定义,它会在编译阶段进行文本替换。例如,`#define PI 3.14159` 将"PI"这个标识符替换为3.14159。然而,宏常量的替换是简单的文本替换,不会进行语法检查,所以使用时需谨慎...

    C语言-预处理

    9.5 本章小结 预处理是C语言编程中的重要环节,它包括宏定义、文件包含和条件编译等特性。合理利用这些特性可以使代码更易读、易维护,并有助于代码的移植和调试。预处理命令的正确使用能够提高程序设计的效率和质量...

    csapp 大作业 hit

    预处理后的文件(如`hello.i`)中不再包含任何预处理指令,所有宏定义和条件编译指令都被展开或去除。例如,常见的宏定义`#define`会被替换为其定义的内容,而条件编译指令如`#ifdef`、`#ifndef`则会影响代码的包含...

    哈工大计算机系统大作业-程序人生

    这些指令包括宏定义、条件编译和文件包含等。预处理器会按照一定的规则对这些指令进行处理,生成预处理后的文件。 ##### 2.2 在UBUNTU下预处理的命令 在Ubuntu环境下,可以通过GCC提供的预处理命令来进行预处理。...

    哈工大计算机系统大作业

    - 处理条件编译指令。 - 输出最终的预处理结果文件。 #### 2.4 本章小结 通过预处理阶段,源代码被转换为更易于编译的形式,为后续的编译步骤做好准备。 ### 第 3 章 编译 #### 3.1 编译的概念与作用 编译是将...

    HIT-ICS2020大作业报告.docx

    预处理是编译的第一步,主要处理#include指令、宏定义以及条件编译指令,将源代码转换为预处理器语言。 2.2 在UBUNTU下预处理的命令 在Ubuntu中,可以使用`cpp`命令对源代码进行预处理,它会处理所有的预处理指令并...

    HIT2024ICS大作业

    #### 1.4 本章小结 通过 HELLO 程序的大作业,学生可以全面地学习和实践计算机系统的各个环节,包括预处理、编译和链接等关键步骤,这对于深入理解计算机系统的工作原理至关重要。 ### 2. 预处理阶段 #### 2.1 ...

    2024哈工大计算机系统大作业-程序人生-Hello’s P2P

    预处理的结果通常会去除宏定义、条件编译指令和文件包含语句,并将相应的代码替换或合并到一起。例如,在 HELLO 程序中可能包含如下的预处理器指令: ```c #include #define HELLO "Hello, World!\n" ``` 预处理后...

    hello's P2P Introduction of Computer System(ICS)

    这些指令通常以 `#` 开头,例如宏定义 (`#define`)、条件编译 (`#ifdef`) 和文件包含 (`#include`) 等。预处理的主要作用是为编译做好准备,如替换宏定义、包含其他文件等。 #### 2.2 在 Ubuntu 下预处理的命令 在...

    HIT 2024 年计算机系统大作业

    预处理是编译过程中的第一步,它主要负责处理源代码中的预处理器指令,如宏定义、文件包含等。预处理可以使得程序更加灵活和易于维护。 #### 2.2 在UBUNTU下预处理的命令 在Ubuntu环境下,可以通过GCC提供的预...

    HIT-2024-ICS大作业

    预处理是C语言程序编译过程的第一步,它主要负责处理源代码中的预处理器指令,如宏定义、条件编译和文件包含等。预处理器会读取源代码并进行相应的替换或调整,为后续的编译做好准备。 ##### 2.2 在UBUNTU下预处理...

    hitcsapp2022112326lyc

    预处理是编译过程的第一步,主要任务是对源代码进行预编译处理,比如宏定义替换、条件编译判断、文件包含等操作。这一步骤是为了让后续的编译工作更加高效、灵活。 ##### 2.2 在UBUNTU下预处理的命令 在UBUNTU环境...

Global site tag (gtag.js) - Google Analytics