8. 停止编译报错

C 语言中 预处理指令 #error 主要用于在编译时强制生成一个错误信息,并立即终止编译。使用 #error 预处理指令可以尽早的在编译阶段发现错误,而不至于在运行阶段出现致命错误。

语法

#error [错误信息]

说明

  1. 错误信息通常为文字信息,用于描述错误原因。可以省略不写。

示例:

在程序中定义一个数组用于存储 100 ~ 10000 个学生的成绩,数组小于 100 不符合设计规范,数组大于 10000 则可能导致栈崩溃。结合上述需求我们编写代码如下:

// filename: error.c
#include <stdio.h>

#if MAX_STUDENT_COUNT < 100
    #error MAX_STUDENT_COUNT is too small
#elif MAX_STUDENT_COUNT > 10000
    #error MAX_STUDENT_COUNT  is too large
#endif

int main(int argc, char * argv[]) {
    int i;
    int scores[MAX_STUDENT_COUNT];
    int total_count = 0;

    printf("数组的元素个数是: %d\n", MAX_STUDENT_COUNT);

    for (i = 0; i < MAX_STUDENT_COUNT; i++) {
        int scr = 0;
        scanf("%d", &scr);
        if (scr < 0) {
            break;
        }
        scores[i] = scr;
    }
    total_count = i;

    return 0;
}

编译运行结果如下:

weimingze@mzstudio:~$ gcc -D MAX_STUDENT_COUNT=1 -o error error.c
error.c:5:6: error: #error MAX_STUDENT_COUNT is too small
    5 |     #error MAX_STUDENT_COUNT is too small
      |      ^~~~~
weimingze@mzstudio:~$ gcc -D MAX_STUDENT_COUNT=9999999 -o error error.c
error.c:7:6: error: #error MAX_STUDENT_COUNT is too large
    7 |     #error MAX_STUDENT_COUNT  is too large
      |      ^~~~~
weimingze@mzstudio:~$ gcc -D MAX_STUDENT_COUNT=1000 -o error error.c
weimingze@mzstudio:~$ ./error
数组的元素个数是: 1000

从上述运行结果可知,使用 gcc 的编译选项 -D MAX_STUDENT_COUNT=1-D MAX_STUDENT_COUNT=9999999 都会在编译时报错,只用 MAX_STUDENT_COUNT 设定为合适的值,程序才能编译通过,程序才可以正常执行。

实验:

使用上述测试代码结合你编译器的预处理选项编译并执行上述程序。