Включение определений функций (в отличие от объявлений) в заголовочные файлы, как правило, плохая идея, и теперь вы знаете, почему. Вы хотите два отдельных файла, заголовок будет выглядеть так:
#ifndef TESTF_H_
#define TESTF_H_
extern int test(int);
#endif
И затем файл .c
(или, возможно, файл .m
, если вы хотите использовать Objective-C вместо простого C), например:
int test(int what) {
return what;
}
Заголовочный файл сообщит компилятору, что такое test
, что он возвращает и какие аргументы он должен принимать; этой информации достаточно, чтобы компилятор организовал вызов test
; это на самом деле больше информации, чем нужно компилятору, но некоторым из нас нравится, когда наши компиляторы выполняют некоторую проверку ошибок. Исходный файл C (после компиляции в объектный файл) сообщит компоновщику, к какому коду относится символ test
.
Прямо сейчас у вас есть несколько глобально видимых экземпляров символа test
, по одному на каждый файл, включающий ваш testf.h
.