改一处,各要重做几个
改了一处,是全都重来,还是只做几个
全都重来
只做几个
(本条路线统一用 gcc -std=c11 -O0 -Wall 编译)把一份最小的依赖表写成数组,顺着它数一数:
#include <stdio.h>
#include <string.h>
/* 一份最小的 Makefile 依赖表:谁依赖谁 */
#define N 5
static const char *name[N] = {"util.h", "util.c", "main.c", "util.o", "app"};
/* dep[i][j] = 1 表示 i 一变,j 就得重做 */
static const int dep[N][N] = {
/* util.h util.c main.c util.o app */
/*util.h*/ {0, 0, 0, 1, 0},
/*util.c*/ {0, 0, 0, 1, 0},
/*main.c*/ {0, 0, 0, 0, 1},
/*util.o*/ {0, 0, 0, 0, 1},
/*app */ {0, 0, 0, 0, 0},
};
/* 从 start 出发,顺着依赖一路标记,数出要重做几个 */
static int touched(int start) {
int mark[N] = {0};
mark[start] = 1;
for (int round = 0; round < N; round++)
for (int i = 0; i < N; i++)
if (mark[i])
for (int j = 0; j < N; j++)
if (dep[i][j]) mark[j] = 1;
int n = 0;
for (int i = 0; i < N; i++) if (mark[i] && i != start) n++;
return n;
}
int main(void) {
/* 改 util.h、改 main.c,各要重做几个 */
printf("%d/%d\n", touched(0), touched(2));
return 0;
}
全部评论