Вот еще одна идея для решения, хотя я все еще думаю, что устранение глобального состояния лучше.
Определите все ваши глобальные переменные в заголовочном файле с помощью макросов:
globals.h:
DEFINE_GLOBAL(int, foo, 5);
DEFINE_GLOBAL(char, bar, 'x');
main.c:
#include <stdio.h>
#define DEFINE_GLOBAL(type, name, initialvalue) type name = initialvalue
#include "globals.h"
#undef DEFINE_GLOBAL
void resetState() {
#define DEFINE_GLOBAL(type, name, initialvalue) name = initialvalue
#include "globals.h"
#undef DEFINE_GLOBAL
}
Я не проверял это, поэтому может потребоваться некоторая коррекция синтаксиса - но я думаю, что концепция обоснована.