Modular C
File Scope State
Module state can live at file scope and be updated through small functions.
private state
A `static` file-scope variable is shared by functions in the file but hidden from other files.
controlled update
Small functions keep changes to that state in one place.
File Scope State
file_scope_state.c
Replay: real traced execution (multi-file project)
#include <stdio.h>
static int total = 0;
static void add_points(int points) {
total += points;
}
int main(void) {
int bonus = 3;
add_points(4);
add_points(bonus);
printf("total=%d\n", total);
return 0;
}
#include <stdio.h>
static int total = 0;
static void add_points(int points) {
total += points;
}
int main(void) {
int bonus = 5;
add_points(4);
add_points(bonus);
printf("total=%d\n", total);
return 0;
}
#include <stdio.h>
static int total = 0;
static void add_points(int points) {
total += points;
}
int main(void) {
int bonus = 8;
add_points(4);
add_points(bonus);
printf("total=%d\n", total);
return 0;
}
bonus ← 3
9int main(void) {10 int bonus→ 3 = 3; //@bonus=5, 811 add_points(4);12 add_points(bonus);total ← 4
pass 1 of 25static void add_points(int points4) {6 total→ 4 += points4;7}add_points(bonus);
10int bonus = 3; //@bonus=5, 811add_points(4);12add_points(bonus3);total ← 7
pass 2 of 25static void add_points(int points3) {6 total→ 7 += points3;7}add_points(bonus);
11 add_points(4);12 add_points(bonus3);1314 printf("total=%d\n", total7);15 return 0;16}outputtotal=7
bonus ← 5
9int main(void) {10 int bonus→ 5 = 5;11 add_points(4);12 add_points(bonus);total ← 4
pass 1 of 25static void add_points(int points4) {6 total→ 4 += points4;7}add_points(bonus);
10int bonus = 5;11add_points(4);12add_points(bonus5);total ← 9
pass 2 of 25static void add_points(int points5) {6 total→ 9 += points5;7}add_points(bonus);
11 add_points(4);12 add_points(bonus5);1314 printf("total=%d\n", total9);15 return 0;16}outputtotal=9
bonus ← 8
9int main(void) {10 int bonus→ 8 = 8;11 add_points(4);12 add_points(bonus);total ← 4
pass 1 of 25static void add_points(int points4) {6 total→ 4 += points4;7}add_points(bonus);
10int bonus = 8;11add_points(4);12add_points(bonus8);total ← 12
pass 2 of 25static void add_points(int points8) {6 total→ 12 += points8;7}add_points(bonus);
11 add_points(4);12 add_points(bonus8);1314 printf("total=%d\n", total12);15 return 0;16}outputtotal=12