Wątek przeniesiony 2018-11-30 03:13 z Newbie przez furious programming.

include widoczny wyłącznie "lokalnie"

0

Witam.
Czy jest możliwe użycie #include "file.h" w taki sposób aby jego zawartość była widoczna wyłącznie lokalnie dla danego pliku albo, żeby wszystko co było dołączone wcześniej zostało zignorowane?

plik: _SPI.h
#ifndef _SPI_H
#define _SPI_H

#include "stm32f4xx.h"
#define RCC_SPI1_ENABLE  RCC->APB2ENR |= RCC_APB2RSTR_SPI1

#endif

innymi słowy problem polega na tym, że gdy chcę dołączyć taki plik do mojego projektu to zawartość stm32f4xx.h wchodzi w konflikt z innymi plikami (w tym przypadku wbudowane pliki w arduino). Jednak chciałbym zrobić tak aby wszystko to co dołączę wewnątrz tego pliku nie wchodziło w konflikty i jednocześnie aby to co sam sobie zdefiniuję było widoczne na zewnątrz.

przykładowy błąd z konfliktem:

In file included from C:\Users\xXx\Documents\Arduino\hardware\Arduino_STM32-master\STM32F4\cores\maple/wirish_types.h:38:0,

                 from C:\Users\xXx\Documents\Arduino\hardware\Arduino_STM32-master\STM32F4\cores\maple/boards.h:42,

                 from C:\Users\xXx\Documents\Arduino\hardware\Arduino_STM32-master\STM32F4\cores\maple/wirish.h:40,

                 from C:\Users\xXx\Documents\Arduino\hardware\Arduino_STM32-master\STM32F4\system/libmaple/Arduino.h:31,

                 from sketch\arduino_flip32.ino.cpp:1:

C:\Users\xXx\Documents\Arduino\hardware\Arduino_STM32-master\STM32F4\cores\maple/libmaple/adc.h:51:3: error: 'ADC_Common_TypeDef' has a previous declaration as 'typedef struct ADC_Common_TypeDef ADC_Common_TypeDef'

 } ADC_Common_TypeDef;
1

Jeśli zainkludujesz plik A.h w pliku B.h to w zasadzie tak jakbyś wkleił do niego zawartość pliku A.h. Jeśli zainkludujesz B.h gdzie indziej, zawartość A.h będzie też tam widoczna. Na końcu wszystko trafia do jakiegoś pliku .cpp który jest kompilowany. W konflikt nie wchodzą ze sobą pliki, tylko symbole w nich zdefiniowane. Bywa, że takie same symbole są zdefiniowane w różnych bibliotekach zewnętrznych i wtedy masz konflikt, np. funkcje min/max z <cmath> wchodzą czasem w konflikt z funkcjami min/max zdefiniowanymi gdzieś w nagłówku "windows.h". W tym celu można oddefiniować pewne symbole, np.:

#ifdef min
#undef min
#endif
#include <wlasciwy plik z definicją min>

Ale jeśli masz tylko swój projekt i jedną bibliotekę zewnętrzną (np. Arduino) to coś takiego nie powinno mieć miejsca, zakładając że ta biblioteka jest spójna i nie wchodzi w konflikty sama ze sobą. Jeśli są konflikty, to znaczy że użyłeś niewłaściwej nazwy i powinieneś ją zmienić. Czy definiujesz gdzieś u siebie strukturę ADC_Common_TypeDef ?

0

ta struktura właśnie jest zdefiniowana zarówno w stm32f4xx.h jak i w "Documents\Arduino\hardware\Arduino_STM32-master\STM32F4\cores\maple/libmaple/adc.h" który to jest jest biblioteką "korową" dla uC stm32 i właśnie ta biblioteka w znacznym stopniu bazuje na zawartości stm32f4xx.h tylko, że jest poszatkowana na wiele mniejszych. Dlatego wygodniej dla mnie by było użyć stm32f4xx.h gdzie wszystko będę mieć w jednym miejscu a nie doszukiwać się czego to jeszcze nie ma we wbudowanej bibliotece albo includowac potem tysiące innych plików

1
smarq napisał(a):

Czy jest możliwe użycie #include "file.h" w taki sposób aby jego zawartość była widoczna wyłącznie lokalnie dla danego pliku

Po co ci nagłówek, jeśli ma być użyty wyłącznie z jednym plikiem cpp/c?


Jedyne powody, dla tego błędu o jakie przychodzą mi do głowy: - masz dwie różne definicje `typedef`, - pochrzaniłeś strażników nagłówków podczas copy paste, - problem natury mieszania C z C++.

Jeśli problemem jest plik nagłówkowy C zewnętrzy (nie twój), dodawany w innym pliku nagłówkowym to zrób tak:

#ifdef __cplusplus
extern "C"
{
#endif

#include "other_header.h"

#ifdef __cplusplus
}
#endif

Jeśli problem stanowi plik nagłówkowy C twój, to ma wyglądać tak:

#ifndef TWOJ_NAGLOWEK_H
#define TWOJ_NAGLOWEK_H

#ifdef __cplusplus
extern "C"
{
#endif

// normalna zawartość nagłówka kodu C:
......

#ifdef __cplusplus
}
#endif
#endif // TWOJ_NAGLOWEK_H

Jeśli robisz include zewnętrznego nagłówka C bezpośrednio z cpp to, po prostu:

extern "C"
{
#include "other_header.h"
}
0
MarekR22 napisał(a):

Jedyne powody, dla tego błędu o jakie przychodzą mi do głowy:

  • masz dwie różne definicje typedef,
  • pochrzaniłeś strażników nagłówków podczas copy paste,
  • problem natury mieszania C z C++.

Nie tylko.
Znana jest "wysoka jakość" tzw bibliotek arduino. Nazwy struktur, klas urabiane od nazwy chipu (rodziny chipów) mają prawdopodobieństwo się pokryć, a wybitni twórcy jeszcze nie przerabiali namespace.

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