高级宏定义
一、宏定义
#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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论