-
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
atman.pl!.POSTED!not-for-mail
From: "Grzegorz Niemirowski" <g...@p...onet.pl>
Newsgroups: pl.misc.elektronika
Subject: Re: Atmel Studio, projekt w wielu plikach i dyrektywa #include
Date: Sun, 24 Nov 2013 15:10:00 +0100
Organization: ATMAN - ATM S.A.
Lines: 78
Message-ID: <l6t1c2$e6j$1@node1.news.atman.pl>
References: <l6sceu$3r4$1@portraits.wsisiz.edu.pl>
NNTP-Posting-Host: 031011139062.warszawa.vectranet.pl
Mime-Version: 1.0
Content-Type: text/plain; format=flowed; charset="UTF-8"; reply-type=original
Content-Transfer-Encoding: 8bit
X-Trace: node1.news.atman.pl 1385302210 14547 31.11.139.62 (24 Nov 2013 14:10:10 GMT)
X-Complaints-To: u...@a...pl
NNTP-Posting-Date: Sun, 24 Nov 2013 14:10:10 +0000 (UTC)
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: OE PowerTool 4.5
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157
X-WWW: http://www.grzegorz.net/
Xref: news-archive.icm.edu.pl pl.misc.elektronika:655735
[ ukryj nagłówki ]Atlantis <m...@w...pl> napisał(a):
> Kompilator zwrócił serię błędów, wskazując na plik nagłówkowy
> zaimportowanej biblioteki. Wszystkie one dotyczyły nieznanego typu
> zmiennej: "unknown type name 'uint16_t'" (tudzież uint8_t),
> występującego w deklaracjach nazw funkcji, umieszczonych w owym pliku
> nagłówkowym. Same definicje funkcji w pliku .c już o nic nie krzyczały.
> Doszedłem do tego, że winny jest brak dyrektywy #include <avr/io.h> na
> początku feralnego pliku nagłówkowego, który ze względu na nazwę jest
> sprawdzany przez kompilator jako pierwszy.
Jak to ze względu na nazwę? Kompilator leci po kolei po linijkach kodu.
> Mam teraz następujące wyjścia:
> 1. Umieścić #include już na początku pliku nagłówkowego, ale chyba nie
> jest to zbyt eleganckim wyjściem.
Dlaczego nie? Skoro plik używa tych typów, to powinien zawierać includy
definiujące te typy.
Tutaj jest w ogóle trochę specyficzna sytuacja. Mówimy bowiem o podstawowych
typach dla AVR (i dla innych uC też), które są wykorzystywane praktycznie w
każdym projekcie. Z tego względu praktycznie każdy plik .c będzie miał
includa dla io.h i będzie importować te typy. Często będzie to pierwsza
linijka w pliku .c. Z tego względu jeśli potem jest include biblioteki, to
te typy są już znane i plik .h biblioteki nie musi ich kompilować. Dlatego
autor biblioteki nie zaincludował io.h w pliku .h swojej biblioteki. Po
prostu założył, że Ty to zrobisz w pliku .c i zrobisz to _przed_
includowaniem jego biblioteki.
Przyznam się, że nie wiem jakie wyjście jest tu uznawane za eleganckie. Moim
jednak zdaniem biblioteka powinna zawierać wszystko co potrzeba i jak
zaincludujemy jej plik .h to nie powinniśmy być zmuszaniu do includowania
innych nagłówków definiujących typy wykorzystywane wewnętrznie przez tą
bibliotekę. No chyba, że uznajemy io.h za wyjątek.
> Na różnych przykłądach widzę, że te
> dyrektywy umieszcza się raczej w plikach *.c.
Kompilator analizując plik .c nie może widzieć żadnych nieznanych wyrażeń,
musi mieć wszystko wcześniej zadeklarowane (niekoniecznie zdefiniowane, ale
zadeklarowane tak). Stosujemy więc pliki nagłówkowe żeby udostępniać
deklaracje typów i funkcji, definicje funkcji siedzą w plikach .c.
Tutaj jest sytuacja taka, że plik .h odwołuje się do typów, których nie ma
standardowo w języku C, dlatego w pliku .h może być odwołanie do innego
pliku .h. Nie jest to nic dziwnego w bardziej złożonych projektach.
> 2. Zmienić nazwy plików tak, aby kompilowały się później.
Po pierwsze kolejność kompilacji nie ma nic do rzeczy. Po drugie o
kolejności decyduje plik Makefile albo inny skrypt budujący (zależnie od
środowiska).
> A może istnieje jakiś sposób na poinformowanie kompilatora, żeby
> dołączył określony plik już na samym początku? Albo żeby zmienił
> kolejność kompilacji poszczególnych plików?
Poczytaj sobie jak działa kompilator. Kompiluje oddzielnie poszczególne
pliki .c, zgodnie z tym, co ma wpisane w Makefile. I przestań mylić
kompilację z dołączaniem plików .h. Kolejność kompilacji nie ma nic
wspólnego z kolejnością dołączania. Pytasz o sposób informowania kompilatora
o dołączanie na samym początku. Dołączanie jest przecież realizowane w
kodzie źródłowym poprzez dyrektywy #include. W jakiej kolejności je
napiszesz, w takiej wskazywane przez nie pliki będą dołączane. Poza tym mam
wrażenie, że myślisz, że plik nagłówkowy się dołącza raz na cały projekt.
Nie. On się dołącza w tym miejscu, w którym jest #include. I koniec końców
dołączany jest to jakiegoś jednego, konkretnego pliku .c. Pliki .c są
kompilowane oddzielnie i nie wiedzą o sobie. Dlatego includy często się
powtarzają. Dopiero jak wszystkie pliki .c są skompilowane, to wkracza
linker tworząc wynikowy plik wykonywalny i zapisując w nim skoki pod
określone adresy. Dlatego w jednym pliku .c możesz odwoływać się do funkcji
zdefiniowanej w drugim. Ale ten pierwszy musi znać deklarację.
--
Grzegorz Niemirowski
http://www.grzegorz.net/
OE PowerTool i Outlook Express: http://www.grzegorz.net/oe/
Uptime: 2 days, 18 hours, 52 minutes and 5 seconds
Następne wpisy z tego wątku
- 24.11.13 15:10 Grzegorz Niemirowski
- 25.11.13 11:04 Piotr Gałka
- 25.11.13 14:38 Marcin
- 25.11.13 15:16 Piotr Galka
- 25.11.13 15:52 Marcin
- 25.11.13 18:49 Marek
- 25.11.13 19:47 Marcin
- 25.11.13 19:55 Marcin
- 24.11.13 22:06 janusz_k
Najnowsze wątki z tej grupy
- DS1813-10 się psuje
- Taki tam szkolny problem...
- LIR2032 a ML2032
- SmartWatch Multimetr bezprzewodowy
- olej psuje?
- Internet w lesie - Starlink
- Opis produktu z Aliexpress
- No proszę, a śmialiście się z hindusów.
- Zewnętrzne napięcie referencyjne LM385 1,2V -> 100mV dla ICL7106, Metex M-3800
- karta parkingowa
- Wl/Wyl (On/Off) bialy/niebieski
- I3C
- Pytanie o transformator do dzwonka
- międzymordzie USB 3.2 jako 2.0
- elektronicy powinni pomysleć o karierze elektryka
Najnowsze wątki
- 2024-11-25 Karty przedpłacone (podarunkowe) Google Play - pytanie do korzystających
- 2024-11-26 wina Tóska
- 2024-11-26 Rewolucja/Rewelacja!
- 2024-11-25 grupa ożyła ;)
- 2024-11-24 Być jak Clint
- 2024-11-24 Rura kanalizacja konceptu Franke = problem
- 2024-11-25 Wrocław => Lead Java EE Developer <=
- 2024-11-25 Warszawa => Business Development Manager - Network and Network Securit
- 2024-11-25 Kraków => Programista Full Stack (.Net Core) <=
- 2024-11-25 Lublin => Senior PHP Developer <=
- 2024-11-25 Karlino => Konsultant wewnętrzny SAP (FI/CO) <=
- 2024-11-25 Warszawa => ECM Specialist / Consultant <=
- 2024-11-25 Katowice => Regionalny Kierownik Sprzedaży (OZE) <=
- 2024-11-25 Warszawa => Senior Frontend Developer (React + React Native) <=
- 2024-11-25 Lublin => Inżynier Serwisu Sprzętu Medycznego <=