> **1.** Section 15.1 listed several advantages of dividing a program into multiple source files.(a). Describe several other advantages - Easier to scale horizontally as developers are added to the team - Reduced cognitive load from less global scope to keep track of > (b). Describe some disadvantages - Increased complexity - Need to maintain/troubleshoot a build system --- > **2.** Which of the following should *not* be put in a header file? Why not? b. Function definitions - Functions should only be defined once, and this allows multiple files to share the same function definition --- > **3.** We saw that writing `#include ` instead of `#include "file"` may not work if file is one that we've written. Would there be any problem with writing `$include "file"` instead of `#include ` if *file* is a system header? Yes, `""` is a path relative to the current file, whereas `<>` is a path to the system's standard library headers. --- > **4.** Assume that `debug.h` is a header file with the following contents... >(a). What is the output when the program is executed? ``` Output if DEBUG is defined: Value of i: 1 Value of j: 2 Value of i + j: 3 Value of 2 * i + j - k: 1 ``` > (b). What is the output if the `#define` directive is removed from `testdebug.c`? ``` Output if DEBUG is not defined: ``` > (c). Explain why the output is different in parts (a) and (b) When `DEBUG` is defined, any instances of the `PRINT_DEBUG` token are replaced with a `printf` call during compile time, but when it's not defined, they're replaced with nothing. > (d). Is it necessary for the `DEBUG` macro to be defined *before* `debug.h` is included in order for `PRINT_DEBUG` to have the desired effect? Justify your answer. Macro invocations are evaluated sequentially, and so if `DEBUG` was defined after `PRINT_DEBUG`, then any usages of `PRINT_EVALUATION` would be have like `DEBUG` was not defined. --- > **5.** Suppose that a program consists of three source files - `main.c`, `f1.c`, and `f2.c`- Plus two header files, `f1.h` and `f2.h`. All three source files include `f1.h` but only `f1.c` and `f2.c` include `f2.h`. Write a makefile for this program, assuming that the compiler is `gcc` and that the executable file is to be named `demo`. ```makefile demo: main.o f1.o f2.o gcc -o demo main.o f1.o f2.o main.o: main.c f1.h gcc -c main.c f1.o: f1.c f1.h f2.h gcc -c f1.c f2.o: f1.o f2.c f2.h gcc -c f2.c f1.o ``` --- > **6.** The following questions refer to the program described in Exercise 5. > (a). Which files need to be compiled when the program is built for the first time? `f1.c`, `f1.h`, `f2.c`, `f2.h`, `main.c`, `main.h` > (b). If `f1.c` is changed after the program has been built, which files need to be recompiled? All dependents of `f1.c` and `f1.c`, in this case `f1.c`, `main.c`, and `f2.c`. > (c). If `f1.h` is changed after the program has been built, which files need to be recompiled? All source files. > (d). If `f2.h` is changed after the program has been built, which files need to be recompiled?