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

include widoczny wyłącznie "lokalnie"

Odpowiedz Nowy wątek
2018-11-29 20:30
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;
edytowany 1x, ostatnio: furious programming, 2018-11-29 20:54

Pozostało 580 znaków

2018-11-29 22:25
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 ?

Pozostało 580 znaków

2018-11-30 04:09
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

No to albo inkludujesz bibliotekę "korową" albo stm32f4xx.h. Jeśli dołączysz obie, to kompilator nie będzie wiedział skąd ma wziąć definicje. Ewentualnie możesz spróbować oddefiniować pewne symbole, tak jak pokazałem. - GutekSan 2018-11-30 09:25

Pozostało 580 znaków

2018-11-30 11:44
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"
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 5x, ostatnio: MarekR22, 2018-11-30 14:51

Pozostało 580 znaków

2019-04-18 20:00
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.

edytowany 2x, ostatnio: AnyKtokolwiek, 2019-04-18 20:08
I w związku z w/w wymienionym powodem użycie Arduino do czegokolwiek ponad gry i zabawy w symulator bomby do paintballa to gruby błąd projektowy na poziomie założeń. No ale nieprzyjaźni modzi z elektrody blokują dostęp do wiedzy, hur dur :P Tzn. to nie jest personalnie do Ciebie, ale widzę w necie taki trend a potem radź sobie z problemami z kapelusza :P - alagner 2019-04-29 14:08
Powiedziałbym nawet, że niektórym zablokowali dostęp do googla. Obecnie jest na elektrodzie wielki zgryz z wielością klas Button, oczywiście namespace nie należy do dobrych/żadnych praktyk tych "lepszych" arduinowców - AnyKtokolwiek 2019-04-30 18:55

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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