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" );