预处理指令(条件编译和宏定义)

c语言的预处理指令包含以下三种:
(1)宏定义
(2)条件编译
(3)文件包含

## 宏定义 ##

  • 不带参数的宏定义
    格式为:#define 标识符 字符串,就是用一个指定的标识符来代替字符串。宏名习惯上用大写字母表示。宏定义只是简单的字符替换因此在使用宏定义时,要注意是否需要在宏定义中或者实参处加括号。宏置换是在预处理阶段进行的。
    宏定义不是c语句,不必在行末加分号,如果加了分号则会连分号一起进行置换,#define指令出现在程序中函数的外边,宏名的有效范围为从该指令起到本源文件结束。通常,#define指令写在文件开头,函数之前,作为文件的一部分,在整个文件范围内有效。可以使用#undef 指令终止宏定义的作用域。例如:
#define G 1000
int main()
{

}
#undef G  //表示G的作用范围到此结束。
f1()
{

}

使用宏后,当需要改变某一个常量时,只要改变宏定义就可以,比如,数组大小可以用以下语句声明:
#define array_size 100
int array[array_szie];

当需要改变数组大小时只需要修改宏定义就行了。
在进行宏定义时,可以引用已定义的宏名,例如:
#define PI 3.14
#define S PI*r*r

  • 带参数的宏定义
    定义一般形式为:#define 宏名() 字符串,不是进行简单的字符替换,还要进行参数替换,字符串中包含在括号中指定的参数,比如:#define S(a,b) a*b
    置换规则:在程序中如果有带实参的宏(如S(3,2),S(x,y)),则按#define指令行中指定的字符串从左到右进行置换,如果在串中遇到宏的形参,则将程序与句中相应的实参代替形参。如果宏定义中的字符串中的字符不是参数字符,则保留。在定义宏时,在宏名与带参数的括号之间不应该加空格,否则将空格以后的字符串都作为替代字符串的一部分。
    #define PI 3.14 #define S(r) PI*r*r,用带参数的宏来求圆面积。

    用带参数的宏可以一次得到多个结果,比如;

#define CIRCLE(R,S,L,V) L=2*PI*R;S=PI*R*R;V=4.0/3.0*PI*R*R*R;
一条宏定义就可以求出圆面积、周长、球体积。

##文件包含 ##
就是一个源文件可以将另一个源文件的全部内容包含进来,即将另外的文件内容包含到本文件之中,插入到当前位置。

##条件编译 ##
有时希望程序中的一部分内容只在满足一定条件时才编译,也就是对这一部分内容指定编译的条件,这就是条件编译。

#ifdef 标识符     若指定的标识符已经被#define指令定义过,则在程序编译
  程序段1         阶段对程序段1进行编译,否则编译程序段2。其中#else
#else            分可以没有,这里的“程序段”可以是语句组也可以是指令行
   程序段2        
#endif     


#ifndef 标识符    若指定的标识符未被定义过,则编译程序段1;否则编译程序
   程序段12
#else
   程序段2
#endif      


#if 表达式        若指定的表达式值为真就编译程序段1;否则编译程序段2。 
  程序段 1
#else
  程序段2
#endif    

猜你喜欢

转载自blog.csdn.net/qq_39785575/article/details/79961429