预处理:宏定义,文件包含,条件编译

  • 预处理是在编译之前进行

宏定义:#define 宏名 宏值

  • 宏定义:不是声明或语句,不需要加分号;
  • 宏定义可以覆盖同名全局变量
#include <stdio.h>
int fun(int);
int n=1;
//若全局变量放在同名宏定义之后则会报错(不能为常量赋值)
int main()
{
    printf("%d %d",n,fun(n));
}
#define n 11
//宏定义会覆盖同名全局变量,此后n就是整型常量
int fun(int x){
    return n+x;
}
//输出:1 12
  • 宏定义的作用域:从定义位置开始到整个程序结束,但可以用 #undef 来终止宏定义的作用域(在终止处加 #undef 宏名
//宏定义允许嵌套 
#define R 5
#define PI 3.14
#define V PI*R*R*R*4/3
//带参数的宏定义:#define 宏名(宏参数) 宏值/参数表达式
#define MAX( x , y ) ((x)>(y)? (x) : (y) )
//每个参数都带括号是为防止不正确输出。例如:
#define SQUARE x * x
SQUARE(5+1)=5+1*5+1=11
//看似像函数,其实有区别:宏定义不需要指明参数的类型,只是做机械式 的替换

#和##是两个预处理运算符;(用于宏定义)

  #:后面跟一个参数,预处理把这个参数转变为一个字符串;

  ##:连接运算符,将左边和右边的参数连接成字符串;

//宏定义也可以传入可变参数(可空参数):
#define SHOWLIST(...)   printf(#__VA_ARGS__)
#define PRINT( format, ...)   printf( format##__VA_ARGS__)
PRINT(num=%d\n,250)————结果会输出:num=250

注:宏定义是在预编译阶段替换代码中;不像函数一样每次调用都要去申请栈空间(这个角度说明宏定义效率高)

  内联函数(inline):由于函数较宏定义效率低,所以有了内联函数;用关键字( inline )修饰函数;(原理:相当于宏定义展开)
  较宏定义的优点:去除了宏定义的不正确输出的风险(编译器会自动判断并修改内联函数)