C语言中带参宏定义

版权声明:本文为博主原创文章,未经博主允许不得转载。。。。没有所谓的原创,只是总结而已 https://blog.csdn.net/W__L__/article/details/70161128
#include<stdio.h> 
/*
1.带参宏定义中,宏名和形参表之间不能有空格出现
2.宏定义中不存在值传递,它只是一个符号的替换过程
3.带参宏定义中,形参不分配内存空间,因此不必做类型定义 
*/ 
/* 
#define MAX(a,b) (a>b)?a:b
void main(void)
{
	int x,y,max;
	printf("Plasy input two numbers :");
	scanf("%d %d",&x,&y);
	max=MAX(x,y);
	printf("The max is: %d\n\n",max);
}
*/
/*
4.在宏定义中的形参是标识符,而宏调用中的实参可以是表达式 
*/
/* 
#define SAY(y) (y)  //y可以是一个表达式 
void main()
{
	int i=0;
	char say[]="hello word!";
	while(say[i])
	{
		say[i]=SAY(say[i]);
		i++;
	}
	printf("\n\t%s\n\n",say);
 } 
*/ 
/*
5.在宏定义中,字符串内的形参通常要用括号括起来
以避免出错 
*/
/*
//例1: 
#define SQ(y) (y)*(y)
//#define SQ(y) y*y      (注释部分为不带括号)
void main()
{
	int a,sq;
	printf("input a number:");
	scanf("%d",&a);
	sq=SQ(a+1); // sq=(a+1)*(a+1)
//  sq=SQ(a+1); // sq=a+1*a+1     (不带括号) 
	printf("sq = %d\n",sq);	
} 

//例2:
#define SQ(y) (y)*(y)
//#define SQ(y) ((y)*(y))
void main()
{
	int a,sq;
	printf("input a number:");
	scanf("%d",&a);
	sq=160/SQ(a+1); // sq=160/(a+1)*(a+1) 
	printf("sq = %d\n",sq);	
} 
*/
/*所以在编程过程中应尽量避免使用过多的宏定义
因为在宏调用时由于优先级的存在会很容易出现逻辑错误, 
*/
/*
5.带参数的宏和带参数的函数很相似,但有本质的不同
除以上各点外,把同一表达式用函数处理和用宏处理的
结果有可能是不同的 
*/

//通过带参函数实现 
/*
void main()
{
	int i=1;
	int SQ(int y);
	while(i<=5)
	{
		printf("%d\n",SQ(i++));
	}
} 
int SQ(int y)
{
	return ((y)*(y));
}
*/
 
//通过宏实现
/* 
#define SQ(y) ( (y)*(y) )
void main()
{
	int i=1;
	while(i<=5)
	{
		printf("%d\n",SQ(i++));
	}
} 
*/

/*
6.宏定义可以用来定义多个语句,在宏调用时,把
这些语句又代换到源程序内 
*/
/* 
#include<string.h>
#define STR(s1,s2,s3,sum) strcat(strcat(strcat(sum,s1),s2),s3);
void main()
{
	char str1[]="上帝",str2[]="是",str3[]="笨蛋",str[40]="";
	STR(str1,str2,str3,str)
	printf("\n\tstr1= %s\n\tstr2= %s\n\tstr3= %s\n\tstr= %s\n\n",str1,str2,str3,str);
}
*/
//strcat(str1,str2)函数将字符串str2粘贴到str1的后面 

猜你喜欢

转载自blog.csdn.net/W__L__/article/details/70161128