重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
在C语言源程序中,允许用一个标识符来表示一个字符串,称为宏,宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。
创新互联服务项目包括临沂网站建设、临沂网站制作、临沂网页制作以及临沂网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,临沂网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到临沂省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
扩展资料:
宏(Macro),是一种批量处理的称谓。计算机科学里的宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式。
计算机语言如C语言或汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C语言的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C程序员可以获得更精巧的宏。
参考资料:
宏定义百度百科
C语言中的宏定义用法分为两种。
1、不带参数的宏定义比较简单,就是用一个指定的标识符来代表一个字符串。它的一般形式为“#define 标识符 字符串”,例如#define E 2.718281828459。这种方法使用户能以一个简单的名字代替一个长的字符串。
2、带参数的宏定义不是仅仅进行简单的字符串替换,还要进行参数替换。其定义的一般形式为;“#define 标识符(宏名)(参数表) 字符串”,字符串中包含在括号中所指定的参数。例如#define S(a,b) a*b area=S(3. 2)。
扩展资料:
宏定义只占编译时间,函数调用则占用运行时间(分配单元,保存现场,值传递,返回),每次执行都要载入,所以执行相对宏定义会较慢。
使用宏定义次数多时,宏定义展开后源程序很长,因为每展开一次都使程序增长,但是执行起来比较快一点(这也不是绝对的,当有很多宏定义展开,目标文件很大,执行的时候运行时系统换页频繁,效率就会低下)。而函数调用不使源程序变长。
宏很难实现变长参数,不过c提供了函数来处理,在c中printf,scanf等函数就是处理变长参数列表的。
如:
#include stdio.h
#include stdarg.h
void print_ints(int, num_of_args, ...)
{
int total = 0, i;
va_list ap;
va_start(ap, num_of_args);
while(num_of_arg--){
i = va_arg(ap, int);
printf("%d\n", i);
total += i;
}
printf("Total is %d \n", total);
va_end(ap);
}
如果使用
print_int(3, 20, 35, 15);
来调用,则输出:
20
35
15
Total is 70
有关函数:
va_start(argptr, parm) 使用argptr对参数列表和第二个参数parm的名称进行初始化
va_arg(argptr, type) 返回参数表中的下一个参数,它必须包含所指定的type
va_end(argptr) 终止参数读取
C语言中定义了va_list, va_start( ), va_arg( ), va_end( ) 这样一组宏来处理可变参数问题。
可以参考printf的声明,创建自己的实现函数。示例:
#includestdio.h
#includestdarg.h
void va_fun(int start,...)
{
va_list arg_ptr;
int nArgValue = start;
int nArgCount = 1;
va_start(arg_ptr,start);
while(nArgValue != -1)
{
printf("arg %d is:%d/n",nArgCount,nArgValue);
nArgValue=va_arg(arg_ptr,int);
++nArgCount;
}
return;
}
main()
{
va_fun(5,1,7,-1);
printf("................/n");
va_fun(2,4,-1);
printf("................/n");
va_fun(-1);
printf("................/n");
//va_fun(); 可变参数函数最少要有一个参数。
}
你是指带参的和不带参数的?
不管带不带参数,一定要记住一点,“原样替换”是宏定义的本质。
在处理之前做了文本替换的工作。
如果说区别的话, 带参数的需要将对应的文本导入到宏定义的定义中去然后再替换,比不带参数多了一步
#define M(y) y*y+3*y /*宏定义*/
k=M(5); /*宏调用*/
那么在编译之前就会变成
k= 5*5 + 3*5
#define M(y) y*y+3*y /*宏定义*/
k=M(3+x); /*宏调用*/
那么在编译之前就会变成
k=3+x*3+x+3*3+x (注意这里原样替换,不能加括号的)
不定参数个数 传递时要指明其参数类型
还有文件包含库 你也没包含进来~
#include stdarg.h //函数可变参数宏包含在此文件中(属于C语言的标准库)
给你一个例子:
/*
功能名称: aveage 通过可变参数宏来完成N个数的平均值计算
入口参数: ParaNum 参数个数 , ... 可能的参数
出口参数: 平均值float
备注名称:
日期版本:
*/
float average(int ParaNum,...);
float average(int ParaNum,...)
{
va_list va_Average;
int count;
long sum;
va_start(va_Average,ParaNum);//va_start 第二个参数为... 的前一个参数
for(count = 1;countParaNum;count++)
{
sum += (long)(va_arg(va_Average,int));
}
va_end(va_Average);
return (float)(sum/ParaNum);
}
不定参数传递的时候,是有标准库的。