Arduino - platnost #define
Jan Waclawek
konfera na efton.sk
Středa Květen 6 16:37:52 CEST 2020
> A v tom je asi to, co nechapu. Vzdyt prece vsechny casti projektu jsou
> odnekud includovane, nebo by aspon mely byt, ne?
Najpravdepodobnejsie nie.
Teoreticky sa da vacsi projekt robit aj tak, ze sa vsetky zdrojove texty
z#includuju dohromady do jedneho velkeho, a ten sa skompiluje a smitec.
Ale nerobi sa to tak.
Inaksie povedane, ak v inkriminovanom zdrojovom texte, v ktorom "nie je
vidiet" #define v inom subor, nenajdete #include suboru, kde ste napisali
ten #define - alebo #include suboru ktory #includuje dany subor atd.
rekurzivne - tak v tom zdrojovom texte ten #define jednoducho nie je.
Dobrym zvykom je ne-#includovat .c subory, t.j. ak ste ten #define napisali
v nejakom .c, tak je takmer iste, ze ho ziadne ine .c nevidia.
Bohuzial, je v tom vela toho "takto sa to tradicne robi", "kazdy vie ze je
to tak" a k tomu bordelu prispievaju IDE a aj samotny gcc (t.j. nie
kompilator ale "driver", ktory ten kompilator a ostatne zlozky prekladaca
vola), ktore cast toho procesu zakryvaju.
Jednou z tych matucich veci su predkompilovane kniznice, najma systemove,
ktore su potom ako binarny objekt zdruzene v knizniciach (t.j. velkom
binarnom subore, lebo zbierka .c suborov nie je kniznica ale "kniznica" -
to je zase taky terminologicky problem, terminologia nikdy nie je pevna a
ustalena). To je nieco co je vzdy schovane prekladacom, takze clovek
nadobudne pocit, ze kedze staci urobit #include <time.h> takze v tom
<time.h> su niekde vsetky tie funkcie atd. co s time.h suvisia. No nie su.
Mechanizmus, ako su pospajane jednotlive binarne objekty (t.j. vysledky
kompilacie jednotlivych .c suborov, ktore sa preprocesuju aj kompiluju
obvykle po jednom) je linkovanie, to s #include nema nic spolocne.
Snazil som sa to rozpisat v tej mojej knizke co som este stale nedopisal
(napr. http://www.efton.sk/tmp/C_ch12.pdf do tej kapitoly po dnesku asi
doplnim aj poznamku o viditelnosti #define... :-) ), vlastne sa toho tyka
pomerne vyznamna cast tej knihy, ale sam s tym nie som spokojny.
wek
----- Original Message ---------------
Subject: Re: Arduino - platnost #define
From: "Pavel Kutina" <hw at prelude.cz>
Date: Wed, 6 May 2020 16:05:26 +0200
To: "HW-news" <hw-list at list.hw.cz>
A v tom je asi to, co nechapu. Vzdyt prece vsechny casti projektu jsou
odnekud includovane, nebo by aspon mely byt, ne?
V hlavnim souboru mam include nejake knihovny, ta si zase inkluduje mejake
dalsi a ty zase dalsi vcetne jejich .h), takze ve vysledku to cele visi na
nejakm strome, ktery zacina v korenu tim hlavnim projektem, takze kdyz
prave
v nem udelam onen #define, tak by na to mel slyset ten preprocesor i u te
inkludovane knihovny z N-te vetve. Ted takhle jsem si to alespon
predstavoval... Jen mi to takhle nefunguje :)
Pavel Kutina
----- Original Message -----
From: "Jan Waclawek" <konfera at efton.sk>
To: "HW-news" <hw-list at list.hw.cz>
Sent: Wednesday, May 06, 2020 3:39 PM
Subject: Re: Arduino - platnost #define
>> Jak se definice dedi
>
> Podla salickeho prava ;-)
>
> Direktivy preprocesora sa nijako "nededia". Preprocesor je (takmer) len
> jednoduchy textualny procesor, ktory prechadza suborom, a kde uvidi napr.
> #define A B, zapamata si, ze ma nahradit za A B, a ked neskor narazi na A,
> prepise ho na B.
>
> Toto sa deje len v ramci jedneho zdrojoveho textu a len v jednom
> priechode,
> t.j. #define z jedneho zdrojoveho textu nie je "vidiet" v inom zdrojovom
> texte.
>
> Pritom si ale treba uvedomit, ze v zdrojovom texte mozu byt zahrnute ine
> zdrojove texty pomocou direktivy #include, tie zahrnute zdrojove texty sa
> stavaju pre ucel preprocesora sucastou povodneho zdrojoveho textu.
>
> Dohoda je (a to je naozaj len nepisana dohoda), ze sa takto "zahrnaju"
> tzv.
> header subory (.h), takze ak chcete aby nejaky #define bol "vidiet" vo
> viacerych zdrojovych (.c) suboroch, tak ho napisete do nejakeho .h suboru
> ktory je #includnuty vo vsetkych dotknutych .c suboroch.
>
> wek
>
>
> ----- Original Message ---------------
>
> Subject: Arduino - platnost #define
> From: "Pavel Kutina" <hw at prelude.cz>
> Date: Wed, 6 May 2020 14:47:22 +0200
> To: "HW-news" <hw-list at list.hw.cz>
>
> Zdravim,
>
> trochu tu valcim s arduinem, mozna spis s C.
>
> Mam tu nejaky bastl, kterym v podstate kopiruju M5Stack, tj., ESP32 s
> prilepenym displejem ILI9341, nic zvlastniho. Protoze chci pouzit puvodni
> M5stack knihovny a nesedi mi displej (otoceni je jinak), tak jsem upravil
> puvodni knihovny pro praci s diplejem, zadrhel je samozrejme v tom, ze pak
> nechodi s originalem.
>
> Chtel jsem do hlavniho souboru zapsat neco jako:
>
> #define ABCD
>
> v knihovnach nasledne
>
> #ifdef ABCD
> ....
> #else
> ....
> #endif
>
> Logicke, jednoduche - lec nefunkcni. Jak se definice dedi a zpracovavaji v
> ramci projektu? V ramci hlavniho kodu natazeneho v IDE to jde, ale v
> knihovnach se to tvari jako nedefinovane, tusi nekdo, kde by mohl byt
> problem? Je dost pravdepodobne, ze neco nechapu, nebo delam blbe...
>
> Diky.
>
> Pavel Kutina
>
>
> --
> Tato zpráva byla zkontrolována na viry programem Avast Antivirus.
> https://www.avast.com/antivirus
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list at list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list at list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz
Hw-list at list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list