高级宏定义
宏定义定义符号常量
- #define [] #undef PI 约定为大写, 编译器不检查宏定义, 不加分号;
- 类似sed流, 带参数必须与宏名()紧密连接, 否则是替换功能
三大预处理功能之一的本质--机械替换不智能
/// C:宏定义定义符号常量
#include <stdio.h>
// 宏定义替换所有PI
#define PI 3.14
int main(void) {
int r;
float s;
printf("请输入圆的半径:");
scanf("%d", &r);
s = PI * r * r;
printf("圆的面积是:%.2f\n", s);
#undef PI; // 结束PI的替换
return 0;
}
嵌套宏定义
///: C:嵌套宏定义
#include <stdio.h>
#define PI 3.14
#define R 6371
#define V PI * R * R * R * 4 / 3
int main(void) {
printf("地球的体积大概是: %.2f\n", V);
return 0;
}
参数宏定义
///: C:参数宏定义
// 无需为参数显式声明类型, 空格作为替换匹配, 使用括号转义
#include <stdio.h>
#define MAX(x,y) (((x) > (y)) ? (x): (y))
int main(void) {
int x, y;
printf("请输入两个整数: ");
scanf("%d%d", &x, &y);
printf("%d 是较大的整数!\n", MAX(x, y)); // MAX(x,y) 替换为 (((x) > (y)) ? (x): (y))
return 0;
}
宏定义替换函数以节省内存
///: C:宏定义替换函数以节省内存
// 宏定义替换基于申请栈的函数
// 内联函数也是宏定义替换流
#include <stdio.h>
#define SQUARE(x) ((x) * (x))
int main(void) {
int i = 1;
while(i<=100) {
int s = i++;
printf("%d 的平方是%d\n", i-1, SQUARE(s));
}
return 0;
}
宏定义替换流为字符串
/// C:宏定义替换流为字符串
#include <stdio.h>
#define STR(s) # s
int main(void) {
// 将HELLO替换为字符串流, 并格式化空格
printf(STR(HELLO %s num = %d), STR(World), 520);
return 0;
}
宏定义的参数连接
///: C:宏定义的参数连接
#include <stdio.h>
#define TOGETHER(x, y) x ## y
int main(void) {
// 将2,50作为##连接运算
printf("%d\n", TOGETHER(2, 50));
return 0;
}
宏定义使用可变参数
///: C: 宏定义使用可变参数
#include <stdio.h>
// 类似于gawk使用命令模式 gawk '{print}'
#define SHOWLIST(...) printf(# __VA_ARGS__)
int main(void) {
SHOWLIST(nagisb, 520, 3.14\n);
return 0;
}
宏定义命令替换
///: C:宏定义命令替换, 以节省输入
#include <stdio.h>
#define PRINT(format, ...) printf(# format, ##__VA_ARGS__)
int main(void) {
PRINT(num = %d\n, 520);
PRINT(HEllo WORLd\n); // 将...可变参数作为可选语句
return 0;
}
宏定义替换指针类型声明
/// C:宏定义替换指针类型声明
#include <stdio.h>
typedef int INTEGER, *PTRINT;
// #define PTRINT int* // 因为替换作用,无法封装的使用类型声明, 仅仅替换第一个要声明的值
int main(void) {
INTEGER a = 520;
PTRINT b, c;
b=&a;
c=b;
printf("a= %p\n", c);
return 0;
}