函数中宏定义的标识符和被调函数中的变量一样时为什么会出错?是因为主调函数中的变量、被调函数中变量、宏定义的标识符相同的原因吗?
还是说其他的?
//错的
#include
#define n 5
sort1(int a[],int n)
{
int i,j,t,flag;
for(i=0;i-1;i++)
{
flag=1;
for(j=0;j-1-i;j++)
if(a[j]1])
{
t=a[j];a[j]=a[j+1];a[j+1]=t;
flag=0;
}
if(flag==1)
break;
}
return n;
}
sort2(int a[],int n)
{
int i,j,t,min;
for(i=0;ifor(j=i+1;jif(a[j]return n;
}
int main()
{
int a[n]={34,45,23,12,67},i,j;
/*for(i=0;i
for(i=0;i<sort1(a,n);i++)
printf("%d ",a[i]);
printf("\n");
for(i=0;i<sort2(a,n);i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
//对的:
#include
#define x 5
sort1(int a[],int n)
{
int i,j,t,flag;
for(i=0;i-1;i++)
{
flag=1;
for(j=0;j-1-i;j++)
if(a[j]1])
{
t=a[j];a[j]=a[j+1];a[j+1]=t;
flag=0;
}
if(flag==1)
break;
}
return n;
}
sort2(int a[],int n)
{
int i,j,t,min;
for(i=0;ifor(j=i+1;jif(a[j]return n;
}
int main()
{
int a[x]={34,45,23,12,67},i,j;
/*for(i=0;i
for(i=0;i<sort1(a,x);i++)
printf("%d ",a[i]);
printf("\n");
for(i=0;i<sort2(a,x);i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
可以重名,在定义了宏之后,无论宏名称出现在源代码的何处,预处理器都会把它用定义时指定的文本替换掉。你定义的n为5,sort函数经过预处理后就成了int 5,变量名的开头必须是字母或下划线,不能是数字。
#include<stdio.h>
#define N 5
#define n str
int sort1(int a[],int n)
{
int i,j,t,flag;
for(i=0;i<n-1;i++)
{
flag=1;
for(j=0;j<n-1-i;j++)
if(a[j]<a[j+1])
{
t=a[j];a[j]=a[j+1];a[j+1]=t;
flag=0;
}
if(flag==1)
break;
}
return n;
}
int sort2(int a[],int n)
{
int i,j,t,min;
for(i=0;i<n;i++)
{
min=i;
for(j=i+1;j<n;j++)
if(a[j]<a[min])
{
t=a[j];a[j]=a[min];a[min]=t;
}
}
return n;
}
int main()
{
int a[N]={34,45,23,12,67},i,j;
/*for(i=0;i<x;i++)
scanf("%d",&a[i]);*/
for(i=0;i<sort1(a,N);i++)
printf("%d ",a[i]);
printf("\n");
for(i=0;i<sort2(a,N);i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
宏定义是在编译期间替换字符串,也就是所有的n都会先替换成5,再执行后续编译
注意,宏定义不是定义变量,它也不是函数