zoukankan      html  css  js  c++  java
  • C[6] 预处理器

    C[6] 预处理器

    预处理器指编译器在实际编译之前完成所需的预处理。C 预处理器(C Preprocessor)简写CPP。它不是编译器的组成部分,是编译过程中一个单独的步骤(可以理解为文本替换工具)。

    1、预处理器指令(以(#)号开头。)

    • #define   //定义宏
    • #include   //包含一个源代码文件
    • #undef   //取消已定义的宏
    • #ifdef   //如果宏已经定义,则返回真
    • #ifndef   //如果宏没有定义,则返回真
    • #if      //如果给定条件为真,则编译下面代码
    • #else   //#if 的替代方案
    • #elif     //如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
    • #endif   //结束一个 #if……#else 条件编译块
    • #error   //当遇到标准错误时,输出错误消息
    • #pragma   //使用标准化方法,向编译器发布特殊的命令到编译器中

    示例:

    #define MAX_LENGTH 10    //定义常量  把所有的 MAX_LENGTH 的值替换为 10
    #include <stdio.h>    // 从系统库中获取 stdio.h,并添加文本到当前的源文件中
    #include "myTest.h"   // 从本地目录中获取 myTest.h,并添加内容到当前的源文件中。
    #undef  FILE_SIZE    //取消已定义的 FILE_SIZE 值
    #define FILE_SIZE 20   //重新定义FILE_SIZE的值为20
    //当 MESSAGE 未定义时,定义 MESSAGE的值。
    #ifndef MESSAGE
       #define MESSAGE "Hello TaoRoy!"
    #endif
    

    2、预处理器运算符  

    2.1 连接或延续 运算符(\) 和  字符串常量化运算符(#)

    #include <stdio.h>
    #define  PrintMessage(a, b)  \     //宏通常写在单行上,太长,则使用“\”运算符连接
        printf(#a#b ": i am fine!\n")    //“#”把一个宏的参数转换为字符串常量.    结果:TaoRoy:i am fine!
    
    int main(void)
    {
       PrintMessage(Tao,Roy);
       return 0;
    }
    

    2.2 标记粘贴运算符(##)

    #include <stdio.h>
    #define Test(a) printf ("Tao" #a " = %d", Tao##a) //(##)合并两个参数(Tao 和 a)
    
    int main(void)
    {
      int Tao520 = 1314;
      Test(520); //输出:Tao520 = 1314
      return 0;
    }

    2.3 defined() 运算符

    #include <stdio.h>
    #if !defined (MESSAGE) //如果没有定义 MESSAGE 这个宏的值,则定义
      #define MESSAGE "Hello TaoRoy!"
    #endif
    
    int main(void)
    {
      printf("Output: %s\n", MESSAGE); //输出:Output:Hello TaoRoy!
      return 0;
    }
    

    3、宏的参数化( #define )

    #include <stdio.h>
    /* 
    int XiangJia(int x) {
       return x + x;
    }
     */
    #define XiangJia(x) ((x) + (x))    //模拟函数 XiangJia  
    #define Max(x,y) ((x) > (y) ? (x) : (y))
    //注意:参数列表是括在圆括号内,且必须紧跟在宏名称的后边。宏名称和左圆括号之间不允许有空格。
    
    int main(void)
    {
       printf("1相加的值: %d\n", XiangJia(1));     //输出:1相加的值:2
       printf("1和2最大值是: %d\n", Max(1, 2));    //输出:1和2最大值是:2
       return 0;
    }

    4、其他预定义的宏(可以使用,但是不能直接修改)

    • __DATE__ //当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。
    • __TIME__ //当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。
    • __FILE__ //这会包含当前文件名,一个字符串常量。
    • __LINE__ //这会包含当前行号,一个十进制常量。
    • __STDC__ //当编译器以 ANSI 标准编译时,则定义为 1。

    示例:

    #include <stdio.h>
    main()
    {
       printf("Date :%s\n", __DATE__ );
       printf("Time :%s\n", __TIME__ );
       printf("Line :%d\n", __LINE__ );
       printf("ANSI :%d\n", __STDC__ );
       printf("File :%s\n", __FILE__ );
    }
    

      

      

     

    创建时间:2021.11.04  更新时间:

  • 相关阅读:
    Apache 虚拟主机 VirtualHost 配置
    EAX、ECX、EDX、EBX寄存器的作用
    Python中文文档 目录(转载)
    八度
    POJ 3268 Silver Cow Party (最短路)
    POJ 2253 Frogger (求每条路径中最大值的最小值,Dijkstra变形)
    2013金山西山居创意游戏程序挑战赛——复赛(1) HDU 4557 非诚勿扰 HDU 4558 剑侠情缘 HDU 4559 涂色游戏 HDU 4560 我是歌手
    HDU 4549 M斐波那契数列(矩阵快速幂+欧拉定理)
    UVA 11624 Fire! (简单图论基础)
    HDU 3534 Tree (树形DP)
  • 原文地址:https://www.cnblogs.com/guorongtao/p/15506978.html
Copyright © 2011-2022 走看看