c语言之带参数的宏定义
时间:2022-07-23
本文章向大家介绍c语言之带参数的宏定义,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.带参数的宏定义中,宏名和新参表之间不能有空格,
2.在带参数的宏定义中,形参参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体值,要用它去代换形参,因此必须作类型说明。
#include<stdio.h>
#include<iostream>
#define MAX(a,b) (a>b)?a:b
int main() {
int x, y, max;
x = 2;
y = 3;
max = MAX(x,y);
printf("%dn", max);
system("pause");
return 0;
}
3.在宏定义中的形参是标识符,而宏调用中实参可以是表达式。
4.在宏定义中,字符串内的形参通常要用括号括起来以避免出错。
5.带参的宏和代餐函数类似,但本质不同,除此之外,把同一表达式用函数处理和用宏处理两者的结果有可能不同。
普通函数:
#include<stdio.h>
#include<iostream>
int SQ(int y) {
return ((y) * (y));
}
int main() {
int i = 1;
int SQ(int y);
while (i <= 5) {
printf("%d ", SQ(i++));
}
printf("n");
system("pause");
return 0;
}
输出:
宏定义:
#include<stdio.h>
#include<iostream>
#define SQ(y) (y)*(y)
int main() {
int i = 1;
while (i <= 5) {
printf("%d ", SQ(i++));
}
printf("n");
system("pause");
return 0;
}
输出:
为什么结果不同呢?这是因为普通函数调用时,实参传给形参的是值,而在宏定义时,要用表达式进行替换,即(i++)*(i++),所以I++会被执行两次。
6.宏定义也可以用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。
#include<stdio.h>
#include<iostream>
#define STR(s1,s2,s3,s4) strcat(strcat(strcat(s4,s3),s2),s1)
int main() {
char str4[] = "ni ";
char str3[] = "hao ";
char str2[] = "a ";
char str1[] = "!!! ";
printf("%sn", STR(str1, str2, str3, str4));
system("pause");
return 0;
}
- 如何实现大图居中超过的部分两边自动隐藏
- Ubuntu16.04安装后开发环境配置和常用软件安装
- wordpress如何屏蔽wp-json(禁用REST API)
- 贝叶斯系列——贝叶斯与其他统计流派的区别和联系
- bootstrap tab切换如何让鼠标移动自动切换内容
- css自动换行如何设置?url太长会撑开页面
- Histogram of Oriented Gridients(HOG) 方向梯度直方图
- 动态规划系列之最长递增子序列问题解答
- Git SSH Key 生成步骤
- 如何将wordpress所有文章批量改为已发布状态
- dedecms提取某栏目及子栏目名称到首页怎么弄
- Bootstrap速学教程之简要介绍
- Ubuntu 安装 JDK8 的两种方式
- git命令-切换分支
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法