zoukankan      html  css  js  c++  java
  • 预处理命令(宏定义,条件编译,头文件)

    宏定义
    <1>不带参数宏定义:#define PI 3.1415926
    <2>带参数的宏定义:
    #define PI  3.1415926
    #define S(r)  (PI*(r)*(r))
    void main(){float  a=2,area;area=S(a); }
    用宏可以得到几个结果: 
    #define CIRCLE(R,L,S,V)  L=2*PI*(R);S=PI*(R)*(R);V=4.0/3.0*PI*(R)*(R)*(R)
    void main(){float r=2,l,s,v;CIRCLE(r,l,s,v);}
      可以用(#undef 标志符)命令终止宏定义的作用域。
    <3>宏定义的副作用:避免在宏参数中使用自增,自减

    #define MIN(A,B) ( (A) <= (B) ? (A) : (B) )

    least = MIN(*p++, b); 
    本函数中,A = *p++ 代入宏函数,得(*p++)<(B) ? (*p++) : (B) ,如果*p++ < B 那么MIN宏中 p++了两次
    注意:
    a,符号常量的使用:用于计算式的常量代表数组大小的常量,循环次数,数字是系统代码(如EOF)
    b,函数调用与宏调用:程序运行时,函数调用把参数的值传递给函数;而编译前,宏调用把参数的语言符号传递给程序。
    使用函数节省空间,使用宏调用节省时间。宏产生内联代码,宏不检查其中的变量类型。
    c,宏的名字不能有空格;用圆括号括住每个参数和宏的整体定义。在嵌套循环中使用宏更有助于加速程序运行。
     
    条件编译
    <1>#ifdef  标志符
    程序段1
    #else 
    程序段2
    #endif
    作用:若所指定的标志符已被#define 定义过并且没有被#undef关闭,则在程序编译阶段编译程序段1,否则编译程序段2.
    在调试程序时:
    #ifdef  DEBUG           //在他的前面有命令:#define DEBUG,调试完成后删除该句就可。
          printf("x=%d,y=%d ",x,y);
            #endif
    <2>#ifndef 标志符 
            程序段1
    #else 
             程序段2
    #endif
    作用:标志符没有被定义过执行程序段1.可以防止该宏被重复定义
    应用:a,可用较小的数组来测试程序。当程序令人满意后,去除#define SIZE 10重新编译,这样不必修改头文件数组自身了。
    b,防止多次包含同一头文件
    //“arrays.h”中
    #ifndef SIZE                  
                #define SIZE   100                          
    #endif
    //在包含该头文件的源文件中
    #define SIZE 10
    #include "arrays.h"
     
    //防止头文件重复包含
    #ifndef  THING_H_
            #define    THING_H_
             /*头文件的其余部分*/
    #endif
     
    <3>表达式中可使用关系运算符和逻辑运算符
    #if 常量整数表达式或define  (VAX)    
              #include "a.h"
    #esif  SYS==3
               #include
    #endif
    <4>预定义宏:不能用#undef取消
    __DATE__(进行预处理的日期 "Mmm dd yyyy")     __FILE__(当前被编译源文件的文件名)      __LINE__(当前被编译代码行的行号)
    __STDC__(设置为1时表示该实现遵循C标准)    __STDC_HOSTED__(为本机环境设置为1,否则为0)  
    __STDC_VERSION__(为C99时设置为 199901L)  __TIME__(源文件编译时间"hh: mm: ss")
    #line 指令用于重置__LINE__ 和 __FILE__ 宏:#line 10 "cool.c" 行号重置为10,文件名重置为cool.c
    #error 指令使编译器发出一条错误消息,该消息包含指令中的文本。编译过程可能中断

    #if __STDC_VERSION__ != 199901L

     

        #error Not C99

     

    #endif

    #pragma 用于修改编译器的某些设置
     
    头文件
    #define指令,结构声明,typedef语句,函数声明,
    外部变量声明:extern int status,static 和 const同时修饰的全局变量
    内联函数(用static和inline修饰)
     
    内部函数,外部函数和内联函数
    <1>内部函数:定义时用static修饰,只能被本文件中其他的函数调用
           作用:使用内部函数,可以使函数的作用域只局限于所在的文件,不同的文件有同名的内部函数,互不干扰,通常把只能由同一文件使用的函数和外部变量放在一个文件中,在它们前面加static使之局部化,其他文件不能引用。
    <2>外部函数:在定义时加extern的函数,可供其他文件调用
           作用:一般将其函数声明放在源文件对应的头文件中,在需要调用此函数的文件中包含该头文件
    <3>内联函数:定义时用inline修饰
    注意:
    a,无法获得内联函数的地址,内联函数不会再调试器中显示。将内联函数的代码插入到调用该函数的地方,内联函数一般较短。
    b,其作用是:代码长度增加,程序执行时间减少。
    c,内联函数具有内部链接,只能在被定义的文件中被调用。‘
    d,多文件中使用内联函数:在头文件中定义内联函数。并用static修饰
  • 相关阅读:
    安卓反编译
    Icesugar Gourd
    php文件写入
    java 序列化与反序列化
    Toj Dominoes Game
    adb&frida
    Markdown 测试用例
    iview InputNumber类输入框表单验证失效
    01背包问题(回溯算法实现)
    阅读作业二读Lost in CatB有感 by 李栋
  • 原文地址:https://www.cnblogs.com/zhoutian220/p/4007199.html
Copyright © 2011-2022 走看看