macro definition - yaokun123/php-wiki GitHub Wiki

高级宏定义

一、宏定义

#include<stdio.h>
#define PI 3.14
#define MAX(x,y) (((x) > (y)) ? (x) : (y))

//高级宏定义

/**
 C语言的三大预处理功能:
 一、文件包含
 二、条件编译
 三、宏定义
 */

/**
 宏定义:
 
 不带参数的宏定义:
 #define PI 3.14
 1.为了和普通的变量进行区分,宏的名字通常我们约定是全部由大写字母组成。
 2.宏定义只是简单的进行替换,并且由于预处理是在编译之前进行,而编译工作的任务之一就是语法检查,所以编译器不会对宏定义进行语法检查
 3.宏定义不是说明或语句,在末尾不必加分号
 4.宏定义的作用域是从定义的位置开始到整个程序结束
 5.可以用#undef来终止宏定义的作用域
 6.宏定义是可以嵌套的
 
 */
int main_1(void){
    int r;
    float s;
    
    printf("请输入圆的半径:");
    scanf("%d",&r);
//#undef PI    如果在这里终止宏定义的作用域下面将不能在使用宏定义
    s = PI * r * r;
    printf("圆的面积是:%.2f\n",s);
}


/**
 带参数的宏定义:
 #define MAX(x,y) (((x) > (y)) ? (x) : (y))
 1、不需要指定参数的类型
 2、由于是机器的替换,所以要使用小括号
 */
int main(){
    int x,y;
    printf("请输入两个整数:");
    scanf("%d",&x);
    scanf("%d",&y);
    printf("两个数中较大的是:%d\n",MAX(x,y));
    return 0;
}

二、内联函数和一些鲜为人知的技巧

//C语言中引入内联函数来解决程序中函数调用的效率问题
//关键字:inline

/**
 内联函数虽然节省了函数调用的时间消耗,但由于每一个函数出现的地方都要进行替换,因此增加了代码编译的时间。另外,并不是所有的函数都能够变成内联函数。
 
 现在的编译器也很聪明,就算你不写inline,他也会自动将一些函数优化成内联函数
 
 总结:编译器比你更了解哪些函数应该内联哪些不能内联,所以这个知识点你只需要知道就好。
 */

inline int square(int x);
inline int square(int x){
    return x * x;
}
int mian(){
    int i = 1;
    while(i <= 100){
        printf("%d的平方是%d\n",i-1,square(i++));
    }
    return 0;
}

三、# 和

//#和##

/**
 1.#和##是两个预处理运算符。
 2.在带参数的宏定义中,#运算符后面应该跟一个参数,预处理器会把这个参数转换为一个字符串。
 3.##运算符被称为记号连接运算符,比如我们可以使用##运算符连接两个参数。
 */

int main_4(){
    printf("%s\n",STR(FISHC));
    return 0;
}

//#define TOGETHER(x,y) x ## y
int main(void){
    printf("%d\n",TOGETHER(2,50));
    return 0;
}

四、可变参数

/**
 1.之前我们学习了如何让函数支持可变参数,带参数的宏定义也是使用可变参数的:
 #define SHOWLIST(...) printf(#__VA_ARGS__)
 
    其中...表示使用可变参数,__VA_ARGS__在预处理被实际参数集所替换
 */
⚠️ **GitHub.com Fallback** ⚠️