Inkludowanie bibliotek i wywoływanie funkcji

0

Witajcie

Piszę w Eaglu program w języku C. Akurat na mikrokontrolery, ale to nie ma znaczenia. Tworzę sobie nową bibliotekę, załóżmy bilioteka1 i includuję nagłówek
biblioteka1.h do main.c. Dokładnie to samo robię z biblioteką biblioteka2. Ponadto do blibliteka2.h includuję biblioteka1.h
Teraz w biblioteka1.h dodaję funkcja1. A w biblioteka2.h dodaję funkcja2. W ciele funkcja2 wywołuję funkcja1. Eclipse wywala mi ostrzeżenie

implicit declaration of function 'funkcja1' .

Oczywiście pomaga to jak w biblioteka2.c dodam na początku extern void funkcja1 (void).
I stąd moje pytanie czy takie rozwiązanie jest poprawne i każdą funkcję którą wykorzystuję w bibliotece z innej biblioteki muszę zadeklarować jako extern, czy powinienem do tematu inaczej podejść.
W nagłówkach .h obu bibliotek stosuję dyrektywy #ifndef, #define, #endif.

1

Wrzuć minimalny kod pokazujący problem - coś pewnie źle includujesz, lecz z opisu nie wynika wprost co.

0

O kurcze, już znalazłem błąd. Jednak nie zadeklarowałem funkcji w pliku nagłówkowym. Ale jak już założyłem temat to się zapytam czy taka struktura programu jest prawidłowa. Póki co program jest mały, ale nie chciałbym aby później wszystko się wysypało. A ten extern w display.c mi się jakoś nie podoba.

main.c

#include "I2C.h"
#include "display.h"

volatile uint8_t writeNumber[6];
volatile uint8_t readNumber[6];

TimeDisplayMode();

I2C.h

#ifndef __I2C__TYPES
#define __I2C__TYPES

#include "stm32f1xx_hal.h"
void WriteAllNumbersToPCF (void); //o tym zapomniałem, dlatego był warning


#endif /*__I2C__TYPES*/

display.h

#ifndef __DISPLAY__TYPES
#define __DISPLAY__TYPES

#include "stm32f1xx_hal.h"
#include "I2C.h"

#endif /*__DISPLAY__TYPES*/

display.c

#include "display.h"

extern volatile uint8_t writeNumber[6];
extern volatile uint8_t readNumber[6];
//extern void WriteAllNumbersToPCF(void);  <-- to już nie potrzebne

void TimeDisplayMode (uint8_t numberMode) {
	switch (numberMode) {
	case 1:
	writeNumber[0] = readNumber[0];
	writeNumber[1] = readNumber[1];
	writeNumber[2] = readNumber[2];
	writeNumber[3] = readNumber[3];
	writeNumber[4] = readNumber[4];
	writeNumber[5] = readNumber[5];
	break;
	case 2:
		break;
	case 3:
		break;
	}
	WriteAllNumbersToPCF();
}
0

1.Słabe nazewnictwo (zwłaszcza zmiennych - readNumber brzmi jak nazwa funkcji, a nie zmiennej).

2.Puste casey w TimeDisplayMode (które z kolei brzmi jak nazwa zmiennej, a nie funkcji :-P).

3.externy są nieuniknione.

0
mlp99 napisał(a):

Witajcie

Piszę w Eaglu program w języku C. Akurat na mikrokontrolery, ale to nie ma znaczenia. Tworzę sobie nową bibliotekę, załóżmy bilioteka1 i includuję nagłówek
biblioteka1.h do main.c. Dokładnie to samo robię z biblioteką biblioteka2. Ponadto do blibliteka2.h includuję biblioteka1.h
Teraz w biblioteka1.h dodaję funkcja1. A w biblioteka2.h dodaję funkcja2. W ciele funkcja2 wywołuję funkcja1. Eclipse wywala mi ostrzeżenie

implicit declaration of function 'funkcja1' .

Oczywiście pomaga to jak w biblioteka2.c dodam na początku extern void funkcja1 (void).
I stąd moje pytanie czy takie rozwiązanie jest poprawne i każdą funkcję którą wykorzystuję w bibliotece z innej biblioteki muszę zadeklarować jako extern, czy powinienem do tematu inaczej podejść.
W nagłówkach .h obu bibliotek stosuję dyrektywy #ifndef, #define, #endif.

Nie ma znaczenia gdzie deklarujesz funkcje.

W skrajnym przypadku można robić nawet tak:

int bomba(double x); // deklaracja zupełnie nieznanej funkcji - do tego miejsca!

// a teraz wywołujemy tę funkcję, np. tak:

int rakieta(....)
{
return bomba(7) + bomba(3);
}

i to jest ok - kompilator to zeżre bez żadnych problemów!

Dopiero na etapie linkowania może pojawić się komunikat, tupu: brak definicji funkcji bomba...
o ile jej nie znajdzie w żadnym z załączonych modułów, w tym i w bibliotekach - typu lib.

1 użytkowników online, w tym zalogowanych: 0, gości: 1