高级宏定义

发布于 2021-07-12 12:47:56 字数 1908 浏览 1548 评论 0

一、宏定义

#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__在预处理被实际参数集所替换
 */

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

lorenzathorton8

文章 0 评论 0

Zero

文章 0 评论 0

萧瑟寒风

文章 0 评论 0

mylayout

文章 0 评论 0

tkewei

文章 0 评论 0

17818769742

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文