宏展开之后的真实值

场景:一个配置值经过两个头文件、好几层宏才最终确定。读源码的人各有各的说法,谁也说服不了谁。 任务:找出 ~/work/pp/main.c 里 int limit = LIMIT; 在预处理之后 limit 的初始值(一个整数)。 可操作范

开始练习 →

谁真正定义了这个函数

场景:三个源文件里都写着同一个函数名,但其中两份被一个宏悄悄变成了 static。链接时用到的只能是对外可见的那一份。 任务:在 ~/work/obj 里找出:函数(名字见 ~/题目.txt)对外可见的那一份定义,在哪个 .c 文件里。 可

开始练习 →

找不到函数的原因

链接器:拿「只用了」去找「有定义」 主程序目标文件 U 用到的函数 另一个目标文件 T 同名函数 哪里都找不到定义,就是 undefined reference 链接时报 undefined reference to `stat_max&#

开始练习 →

头文件里的全局变量

头文件里写了 int count = 0;,被两个 .c 文件包含,链接时会【0】。

开始练习 →

只初始化一次的计数

next_id() 每调用一次应该返回一个新编号(101、102、103…)。补全,输出三次调用的结果。 (本题用 gcc -std=c11 -O0 编译。)

开始练习 →

链接时找不到函数

场景:一个两文件的统计程序,编译都过了,最后一步却报 undefined reference,可执行文件一直出不来。 任务:让 cd ~/work/link && gcc -std=c11 -o app main.c sta

开始练习 →

全局变量重复定义

场景:一个计数模块把全局变量直接写在了头文件里。两个 .c 都包含了它,链接器报 multiple definition。 任务:修好 ~/work/glob 的源码,让全局变量只定义一次、两个文件共用同一个,编译出 ~/work/glob

开始练习 →

命令行开头那一格

Makefile 里,规则下面的命令行必须以【0】开头,否则会报 missing separator。

开始练习 →

漏写了头文件依赖

目标 main.o 的依赖里漏写了 geom.h,改了 geom.h 之后运行 make,它会【0】。

开始练习 →

要不要重编

make 的核心判断:目标的时间戳比任何一个依赖旧,就要重编(相等不算)。补全 need,输出三个判断结果。 (本题用 gcc -std=c11 -O0 编译。)

开始练习 →