include widoczny wyłącznie "lokalnie"

include widoczny wyłącznie "lokalnie"

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

SM
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:47
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?

Kopiuj
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:

Kopiuj
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: flowCRANE
GS
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 12 godzin
  • Postów:1265
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.:

Kopiuj
#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 ?

SM
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:47
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

GS
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.
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
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:

Kopiuj
#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:

Kopiuj
#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:

Kopiuj
extern "C"
{
#include "other_header.h"
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 5x, ostatnio: MarekR22
AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 dni
  • Postów:3561
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.


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 2x, ostatnio: AnyKtokolwiek
AL
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
AK
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
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)