高级宏定义

宏定义定义符号常量

  • #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;
}
posted @ 2024-11-05 15:48  NAGISB  阅读(5)  评论(0编辑  收藏  举报