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

    C预处理器

     

    目录

    • 概述
    • 文件包含
    • 宏替换
    • 条件包含

    概述

    预处理器是编译过程中单独执行的第一个步骤

    文件包含

    #include "文件名" / #include <文件名>

    注:

    文件包含将被替换为由文件名指定的文件内容

    如果某个包含文件的内容发生了变化,那么所有依赖于该包含文件的源文件都必须重新编译

    宏替换

    书写格式:#define 名字 替换文本

    注:

    宏定义若分成多行,此时需要在行末尾加上一个反斜杠符

    #define指令定义的名字的作用域从其定义点开始,到被编译的源文件的末尾处结束,宏定义中也可以使用前面出现的宏定义

    宏定义带参数

    要适当使用圆括号以保证计算次序的正确性

    #undef指令取消名字的宏定义

    举例

    #define max(A, B) ((A) > (B) ? (A) : (B))

    max(z+1)

    max(i++, j++) //将对每个参数执行两次自增操作

    常量的宏定义

    举例说明

    #define PI 3.14  //浮点类型

    #define doublePI 2*PI  //宏定义中可以使用先前定义过的宏

    注意事项

    在结尾不能使用“;”分号,否则会编译报错

    函数的宏定义

    带参函数的宏定义

    #define showText(number) printf("number is %d",number)

    给宏定义的函数增加一个参数作为函数的返回值

    #define getReturnValue(numA,numB,returnValue) if(numA>numB) returnValue = numA; else returnValue = numB;

    宏定义时如果想通过换行来提高代码的可读性,此时在行的末尾需要使用“ ”

    例如

    #define changedLine()

      if(10<20){

        printf("hello");

      }

    注意

    函数的宏定义是不可以有返回值的 

    函数宏不可以赋值给一个变量,例如:int a = macro(); 这种写法是错误的 

    宏定义的运用 

    把一些常用的变量或方法以宏定义的形式放在代码中,一方面可以提高代码的可读性(注意对宏的命名,让人能够一目了然这个宏是干什么用的),另一方面可以提高开发效率(不用重复定义一些常用的变量或方法)

    问题研究

    函数的宏定义在末尾是否要用”;“

    宏定义的函数传入的参数类型程序是怎么做判断的;

    条件包含

    #if、#endif、#elif(类似于else if)或#else

    #ifdef、#ifndef

    注:

    #if语句中可以使用表达式defined(名字),当名字已经定义时,其值为1;否则其值为0

    举例

    保证hdr.h文件的内容只被包含一次,避免多次重复包含同一文件

    #if !defined(HDR)

    #define HDR

    /* hdr.h文件的内容放在这里 */

    #endif

    改写:

    #ifndef HDR

    #define EDR

    /* hdr.h文件的内容放在这里 */

    #endif

    测试系统变量SYSTEM,根据该变量的值确定包含哪个版本的头文件

    #if SYSTEM == SYSV

      #define HDR "sysv.h"

    #elif SYSTEM == BSD

      #define HDR "bsd.h"

    #else

      #define HDR "default.h"

    #endif

    #include HDR

     

  • 相关阅读:
    OAuth 2.0之授权码模式
    Rest和Restful & http
    HTTP1.1协议中文版-RFC2616
    Linux中安装Python2.7
    CvMat、Mat、IplImage之间的转换详解及实例
    ROS Node/Topic/Message/Service的一些问题
    ROS的tf_tree相关
    机器人路径规划(包括行人检测及动态避障总结)(长期更新)
    相关博客链接(长期更新)
    关于视觉里程计以及VI融合的相关研究(长期更新)
  • 原文地址:https://www.cnblogs.com/IOS-Developer/p/4271039.html
Copyright © 2011-2022 走看看