首页 > 代码库 > 预处理命令(宏定义,条件编译,头文件)

预处理命令(宏定义,条件编译,头文件)

宏定义
<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\n",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修饰

 

预处理命令(宏定义,条件编译,头文件)