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

bonus
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;
}
  1. bonus ← 3

    9int main(void) {10    int bonus→ 3 = 3; //@bonus=5, 811    add_points(4);12    add_points(bonus);
  2. total ← 4

    pass 1 of 2
    5static void add_points(int points4) {6    total→ 4 += points4;7}
  3. add_points(bonus);

    10int bonus = 3; //@bonus=5, 811add_points(4);12add_points(bonus3);
  4. total ← 7

    pass 2 of 2
    5static void add_points(int points3) {6    total→ 7 += points3;7}
  5. add_points(bonus);

    11    add_points(4);12    add_points(bonus3);1314    printf("total=%d\n", total7);15    return 0;16}
    outputtotal=7
  1. bonus ← 5

    9int main(void) {10    int bonus→ 5 = 5;11    add_points(4);12    add_points(bonus);
  2. total ← 4

    pass 1 of 2
    5static void add_points(int points4) {6    total→ 4 += points4;7}
  3. add_points(bonus);

    10int bonus = 5;11add_points(4);12add_points(bonus5);
  4. total ← 9

    pass 2 of 2
    5static void add_points(int points5) {6    total→ 9 += points5;7}
  5. add_points(bonus);

    11    add_points(4);12    add_points(bonus5);1314    printf("total=%d\n", total9);15    return 0;16}
    outputtotal=9
  1. bonus ← 8

    9int main(void) {10    int bonus→ 8 = 8;11    add_points(4);12    add_points(bonus);
  2. total ← 4

    pass 1 of 2
    5static void add_points(int points4) {6    total→ 4 += points4;7}
  3. add_points(bonus);

    10int bonus = 8;11add_points(4);12add_points(bonus8);
  4. total ← 12

    pass 2 of 2
    5static void add_points(int points8) {6    total→ 12 += points8;7}
  5. add_points(bonus);

    11    add_points(4);12    add_points(bonus8);1314    printf("total=%d\n", total12);15    return 0;16}
    outputtotal=12