Или вы можете использовать экстерьер.
Определить функцию в main.c:
void sj_handleException(bool fatal, const char* msg, const char* libMsg){
fprintf(stderr, msg);
if(libMsg != NULL) fprintf(stderr, libMsg);
if(fatal) exit(EXIT_FAILURE);
}
Любой файл, который выделяет память, добавляется так же, как и в случае предварительного объявления:
extern void sj_handleException(bool fatal, const char* msg, const char* libMsg)
Теперь напишите malloc как:
char *ptr = (char *)malloc(sizeof(char) * some_int);
if (ptr == NULL) sj_handleException(true, "failed to allocate memory.\n", NULL);
Связь между местом в вашем коде, где вы используете malloc'd memory, и main.c, который обрабатывает исключение, генерируется компоновщиком за кулисами; он сопоставляет вызовы функции с функцией, даже если они существуют в разных исходных файлах.