notes/education/software development/ECE1400/Chapter 15 Exercises.md
2024-11-10 21:51:06 -07:00

3.0 KiB

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 <file> 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 <file> 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.

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?