C: const 还是 define?有什么区别,为什么第二个报告错误?
C: const or define? What's the difference and why the second report an error?
#include <stdio.h>
#include <stdlib.h>
#define MAX 15 //line that give problems
int linearSearch(int v[], int MAX, int valore);
int main()
{
int ris, valore, v[]={1,1,1,1,1,1,1,1,1,12,1,1,1,1,1};
scanf("%d", &valore);
ris = linearSearch(v, MAX, valore);
printf("%d", ris);
return 0;
}
int linearSearch(int v[], int MAX, int valore)
{
int i;
for (i=0;i<MAX;i++)
{
if(valore==v[i])
return i;
}
return -1;
}
为什么这段代码在编译时报错?如果我用
替换预处理器指令,为什么它 运行 正确
const int MAX = 15;
宏(大部分)是简单的文本替换,因此:
#define MAX 15 //line that give problems
int linearSearch(int v[], int MAX, int valore);
将被预处理为:
int linearSearch(int v[], int 15, int valore);
^
当然,您不能为标识符指定数值。
在函数声明中
int linearSearch(int v[], int MAX, int valore);
及其定义
int linearSearch(int v[], int MAX, int valore)
{
//...
}
标识符MAX
表示变量名
但是由于宏定义
#define MAX 15
函数声明和定义看起来像
int linearSearch(int v[], int 15, int valore);
int linearSearch(int v[], int 15, int valore)
{
int i;
for (i=0;i<15;i++)
{
if(valore==v[i])
return i;
}
return -1;
}
因为预处理器在程序编译之前将所有 MAX
替换为 15。
Macto 定义没有作用域。因此最好使用通常的常量声明。如果你会写
const int MAX = 15;
那么这个名字MAX
和函数声明中的名字MAX
int linearSearch(int v[], int MAX, int valore);
有不同的范围,代码将被成功编译。
请注意,当您定义常量时,您指定的类型不一定与相应整数文字的类型相同。例如,您可以定义常量
const unsigned int MAX = 15;
现在比较以下条件的结果,一方面使用上面定义的常量,另一方面使用宏定义。
const unsigned int MAX = 15;
if ( MAX > -1 ) puts( "MAX is greater than -1" );
else puts( "MAX is less than -1" );
和
#define MAX 15
if ( MAX > -1 ) puts( "MAX is greater than -1" );
else puts( "MAX is less than -1" );
#include <stdio.h>
#include <stdlib.h>
#define MAX 15 //line that give problems
int linearSearch(int v[], int MAX, int valore);
int main()
{
int ris, valore, v[]={1,1,1,1,1,1,1,1,1,12,1,1,1,1,1};
scanf("%d", &valore);
ris = linearSearch(v, MAX, valore);
printf("%d", ris);
return 0;
}
int linearSearch(int v[], int MAX, int valore)
{
int i;
for (i=0;i<MAX;i++)
{
if(valore==v[i])
return i;
}
return -1;
}
为什么这段代码在编译时报错?如果我用
替换预处理器指令,为什么它 运行 正确const int MAX = 15;
宏(大部分)是简单的文本替换,因此:
#define MAX 15 //line that give problems
int linearSearch(int v[], int MAX, int valore);
将被预处理为:
int linearSearch(int v[], int 15, int valore);
^
当然,您不能为标识符指定数值。
在函数声明中
int linearSearch(int v[], int MAX, int valore);
及其定义
int linearSearch(int v[], int MAX, int valore)
{
//...
}
标识符MAX
表示变量名
但是由于宏定义
#define MAX 15
函数声明和定义看起来像
int linearSearch(int v[], int 15, int valore);
int linearSearch(int v[], int 15, int valore)
{
int i;
for (i=0;i<15;i++)
{
if(valore==v[i])
return i;
}
return -1;
}
因为预处理器在程序编译之前将所有 MAX
替换为 15。
Macto 定义没有作用域。因此最好使用通常的常量声明。如果你会写
const int MAX = 15;
那么这个名字MAX
和函数声明中的名字MAX
int linearSearch(int v[], int MAX, int valore);
有不同的范围,代码将被成功编译。
请注意,当您定义常量时,您指定的类型不一定与相应整数文字的类型相同。例如,您可以定义常量
const unsigned int MAX = 15;
现在比较以下条件的结果,一方面使用上面定义的常量,另一方面使用宏定义。
const unsigned int MAX = 15;
if ( MAX > -1 ) puts( "MAX is greater than -1" );
else puts( "MAX is less than -1" );
和
#define MAX 15
if ( MAX > -1 ) puts( "MAX is greater than -1" );
else puts( "MAX is less than -1" );