张银峰的编程课堂

定义符号常量

考虑一个求平均值的程序。

#include <stdio.h>

int main()
{
    int sum = 0;
    int vals[7] = { 75, 77, 89, 92, 56, 68, 94 };

    for (int i = 0; i < 7; i += 1)
        sum += vals[i];

    printf("average: %d\n", sum / 7);
    return 0;
}

现在试着将数组的元素个数增大,这时程序中与元素个数相关的地方都需要同步修改。你可能会尝试使用一个变量来解决这个问题,不幸的是这并不正确 。

int size = 3;                   // 定义size维护数组元素个数
int vals[size] = { 1, 2, 3 };   // 错误:元素个数必须是一个常量值。

解决方法是将这个数字定义为符号常量。

定义符号常量

符号常量是指用一个标识符代表一个常量。变量在程序中是通过分配一个名称来标识引用,符号常量与此类似,遵循先定义再使用的原则,定义符号常量由#define预处理指令实现,语法如下:

#define 标识符 常量

常量标识符通常使用大写表示。下面的代码中我们使用 ARRAY_SIZE 来维护数组的大小,可以看到,符号常量相当于给数取了一个有意义名称,提高了程序的可读性;同时关于这个数只需要修改一次,就能自动应用到整个程序,这使得程序的维护性大大提高。

#include <stdio.h>

#define ARRAY_SIZE  7

int main()
{
    int ia[ARRAY_SIZE] = { 0, 1, 2, 3, 4, 5, 6 };

    for (int i = 0; i < ARRAY_SIZE; i++)
        printf("%d ", i);

    return 0;
}

ZYF

glimix.com

它只是替换

#define是一条预处理指令。预处理,即预先处理的意思,通常是在编译程序前由预处理器对程序文件进行的一种先决处理。预处理指令都以"#"开头(#include也是哦),并且每条预处理指令位于独立的一个代码行,行尾结束不包含分号;即预处理指令不是程序语句。

使用#define定义的符号常量,在代码预处理阶段时只是被简单的替换为对应的值。

因此,ia[ARRAY_SIZE]会被替换为ia[7],也就是说程序中凡是使用ARRAY_SIZE的地方,最终都会被数字7所代替。下面的程序使用了极端的方式演示了#define作为替换的本质,当然,在实际的开发过程中不要这么做,这使得程序难以阅读与维护,尤其是会造成调试上的不便。语言是让我们优雅的交流,而不是更多的制造障碍。

#include <stdio.h>

#define BEGIN           {
#define END             }
#define ENTRY_POINT     int main()
#define MESSAGE         glimix.com\n"

ENTRY_POINT
BEGIN
    printf(MESSAGE);
    return 0;
END

glimix.com

ZYF