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