Правильно ли многократное включение одних и тех же исходных файлов через проект? - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь вызвать метод в моем main, который объявлен в другом файле.

Когда я пытаюсь вызвать его с этой строкой кода в Main. c:

#include "SPI3.c"

void main(void) {

initSpi();

}

выдает следующую ошибку:

SPI3.c:196:: error: (237) function "_initSpi" redefined

Функция объявлена ​​в файле SPI3. c

void initSpi()
{
     //CODE

}

Я тщательно исследовал свой код и нет переопределения функции, и при поиске в сети я видел, что ошибка также появляется, когда вы вызываете функцию, которая еще не объявлена, или когда вы включаете один и тот же файл более одного раза, и она переопределяет функцию.

Я уверен, что это первое, потому что я на самом деле делаю более одного включения этого файла в проект, потому что мне также нужно вызывать эти методы в других файлах.

Что я делаю неправильно? Может быть только одно включение исходного файла во всем проекте? Или есть другое решение? Может быть, функция просто не инициализирована?

Спасибо, не стесняйтесь спрашивать более подробную информацию.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Включая любой файл, вы вставляете его содержимое в свой файл. Итак, функция initSpi() имеет значение , определенное дважды: в пределах SPI3. c и Main. c => вы получите переопределение. Вам нужно включать только заголовки .h, а не. c файлы. Эти заголовочные файлы содержат только объявлений (в отличие от определений), например:

/* SPI3.h */
void initSpi();

Итак, мы включаем заголовочные файлы в наш файл и получаем объявления функций и переменных, которые определены в другом месте. Чтобы связать их определения, нам также может понадобиться Makefile или C файл проекта.

1 голос
/ 18 февраля 2020

Вы не должны включать. c файлы, но .h файлы (кроме случаев, когда вы точно знаете, что делаете).

Я бы предпочел сделать следующее: в вашем файле SPI3.h, объявите свою функцию:

void initSpi(void);

Не забудьте Включите охрану в свой .h файл

и в свой основной. c файл:

#include "SPI3.h"

Таким образом, ваша функция определяется только один раз (в вашем файле SPI3. c), и вы не получите переопределенную ошибку.

Только для пояснения

Когда вы пишете следующий код в своем файле. c:

void initSpi()
{
     //CODE

}

Затем вы объявляете и определяете свою функцию.

Когда вы пишете следующий код в своем. h file:

void initSpi(void);

Тогда вы просто объявляете свою функцию. Это ваша функция prototype .

Ваша функция может быть объявлена ​​несколько раз, но может быть определена только один раз (кроме случаев, когда используется слабое ключевое слово ).

Поэтому рекомендуется объявлять (и только объявлять) ваши функции в файлах .h и включать только эти файлы в ваши файлы. c.

...