Вы на самом деле компилируете исходный код test.c
дважды:
test.c
сам, main.c
, который включает весь test.c
источник. , В чем Вы нуждаетесь в Вашем main.c
для использования эти test()
, функция является простым объявлением, не его определением. Это достигается включением test.h
заголовочный файл, который содержит что-то как:
void test(void);
Это сообщает компилятору, что такая функция с входными параметрами и типом возврата существует. Что делает эта функция (все в {
, и }
) оставлен в Вашем test.c
файл.
В main.c, замените #include "test.c"
[1 113].
А длятся точку: так как Ваши программы будут более сложны, с Вами будут стоять к ситуациям, когда заголовочные файлы смогут несколько раз включаться. Для предотвращения этого источники заголовка иногда включаются определенными макроопределениями, как:
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
void test(void);
#endif
При использовании Visual Studio, Вы могли бы также сделать "#pragma однажды" наверху headerfile для достижения того же самого как "#ifndef..." - обертывание. Некоторые другие компиляторы, вероятно, поддерживают его также.... Однако не делайте этого: D Палка с #ifndef-wrapping для достижения совместимости кросс-компилятора. Я просто хотел сообщить, что Вы могли также сделать #pragma однажды, так как Вы, вероятно, встретите этот оператор вполне немного при чтении другого кода народов.
Удача с ним
Включая реализацию файл (test.c
) заставляет это предварительно ожидаться к Вашему main.c и соответствовал тут же снова отдельно. Так, функция test
имеет два определения - один в объектном коде main.c
и однажды в том из test.c
, который дает Вам нарушение ODR. Необходимо создать заголовочный файл, содержащий объявление test
, и включать его в main.c
:
/* test.h */
#ifndef TEST_H
#define TEST_H
void test(); /* declaration */
#endif /* TEST_H */
Подчеркивание помещается там компилятором и используется компоновщиком. Основной путь:
main.c
test.h ---> [compiler] ---> main.o --+
|
test.c ---> [compiler] ---> test.o --+--> [linker] ---> main.exe
Так, Ваша основная программа должна включать заголовочный файл для тестового модуля, который должен состоять только из объявлений, таких как прототип функции:
void test(void);
Это позволяет компилятору знать, что он существует, когда main.c компилируется, но фактический код находится в test.c, тогда test.o.
Это - связывающаяся фаза, которая объединяется эти два модуля.
включением test.c в main.c, Вы определяете тест () функция в main.o. По-видимому, Вы тогда связываете main.o и test.o, оба из которых содержат функциональный тест ().
Вы не должны включать другие исходные файлы (*.c) в .c файлы. Я думаю, что Вы хотите иметь заголовок ( ч) файл с ОБЪЯВЛЕНИЕМ тестовой функции, и иметь это - ОПРЕДЕЛЕНИЕ в отдельном.c файле.
ошибка вызывается повторными определениями тестовой функции (один в test.c и другом в main.c)
Если Вы добавили test.c к своему Коду:: проект Блоков, определение будет замечено дважды - однажды через #include и однажды компоновщиком. Вы должны: