Если вы хотите, чтобы код повторно входил, вы должны избегать использования глобальных переменных или файловых статических переменных.
В C ++ вы оборачиваете переменные в классе (с помощью конструктора) и создаете экземпляр класса для каждого отдельного набора операций.
В C вы моделируете то, что делаете в C ++.
Например, в C ++:
#include <stdio.h>
class Counter
{
int counter;
public:
Counter() : counter(1) { }
int incIt(int a) { counter += a; return counter; }
};
int main()
{
Counter c1;
Counter c2;
printf("First: %d\n", c1.incIt(5));
printf("Second: %d\n", c2.incIt(7));
return 0;
}
Или, в C:
#include <stdio.h>
typedef struct Counter
{
int counter;
} Counter;
void initCounter(Counter *c) { c->counter = 1; }
int incIt(Counter *c, int a) { c->counter += a; return c->counter; }
int main()
{
Counter c1;
Counter c2;
initCounter(&c1);
initCounter(&c2);
printf("First: %d\n", incIt(&c1, 5));
printf("Second: %d\n", incIt(&c2, 7));
return 0;
}
Если вы действительно не можете изменить исходный код, значит, вы застряли. Одна возможность состоит в том, чтобы извлечь нужный вам код в новый исходный файл, который допускает реентерабельный дизайн (функции и переменные переименовываются по мере необходимости). Используйте новый код. В противном случае вы застряли - вы должны вернуться к поставщику и попросить внести необходимые изменения.