W programowaniu często się zdarza, że pisząc program chcemy aby jakieś funkcji były opcjonalne. Na przykład możemy mieć opcjonalne spi. Załóżmy że posiadamy funkcji spi_gpio_init
, która inicjuje gpio. Wołana jest ona w gpio_init
, która inicjuje wszystkie peryferia. Definicja funkcji spi_gpio_init
jest prosta, po prostu opakowujemy w #define
/* spi.c */
#ifdef CONFIG_SPI
void spi_gpio_init(void)
{
/* code */
}
#endif
Teraz pozostaje problem z deklaracjami. Jak na moje to mamy dwa rozwiązania tutaj
Rozwiązanie pierwsze:
/* spi.h */
#ifdef CONFIG_SPI
void spi_gpio_init(void);
#endif
/* boot.c */
void gpio_init(void)
{
#ifdef CONFIG_SPI
spi_gpio_init();
#endif
}
Rozwiązanie drugie:
/* spi.h */
#ifdef CONFIG_SPI
void spi_gpio_init(void);
#else
static inline spi_gpio_init(void) {}
#endif
/* boot.c */
void gpio_init(void)
{
spi_gpio_init();
}
Jak widać, różnica jest taka, że 1 rozwiązanie dodatkowo zasyfia header, a drugie dodaje syf do samego już kodu. Osobiście stosuję metodę drugą, bo kompilator i tak wywali funkcję spi_gpio_init
jako, że nic się tam nie dzieje - nawet jakby tam był return 0
to i tak optymalizator powinien wyciąć to wszystko w pień.
I tutaj powstaje pytanie. Znacie jakieś inne metody na rozwiązanie takiego problemu? Może jest jeszcze lepsze rozwiązanie problemu, którego nie znam?