Вы определяете my_var
один раз на единицу компиляции . Помните, что включение охранников выполняется на основе каждой единицы компиляции.
Чтобы исправить это, вы должны объявить my_var
как extern
в заголовке:
#ifndef _HEAD_H_
#define _HEAD_H_
extern int my_var;
#endif
и определяют его в одном из исходных файлов, используя
int my_var = 100;
. Тогда компоновщик видит только одно определение, и все будет хорошо.