Type-safe enum zászlók alapján
Ha működik mikrokontroller alacsony szinten nagyon gyakran szükség van, hogy működik a külön bit a konfigurációs regiszter, különböző zászló kimondja, stb Hagyományosan, a nyelv a „C” használnak erre bites integer és műveletek velük. Minden úgy tűnik, hogy egyszerű és világos, hogy mi kell még? Írja biztonságát. Egész változó használt zászlók, hozzá lehet rendelni bármennyi sejtett, és a fordító nem lesz teljesen ellene.
Térjünk át a gyakorlatba. Szimbolikus neveket a zászló kényelmes deklarálni enum-a:
Tipikus egész flag változót:
Eddig minden úgy néz ki, tiszta és szép, de semmi sem akadályozza meg, hogy megírjuk ezt:
Milyen zászlókat le, van telepítve? A fordító még enni, és nem megfojtani, myFlags - egész változó, és képes tárolni bármit. De néha úgy tűnik, olyan egyszerű, ahelyett, hogy egy hosszú sora a következő formában: flag0 | flag1 |. | flagM írjon egy rövid kis szám, hogy úgy tűnik annyira nyilvánvaló ... Most - egyértelmű holnap maguknak, hiszen már nem semmi, hogy azt jelenti, de mások számára, és még inkább.
Kívánatos lenne, hogy kerítés magukat az ilyen „extra kapacitás”, hogy működjön együtt a zászlók súlyosabb volt. Nyilvánvaló, hogy ebben az esetben tárolja a zászlók nem kell egész változó, de egy változó típusú enum-a - MyFlags.
Az első sor a várakozásoknak megfelelően működik, akkor nem lehet hozzárendelni egy változó zászlók amúgy-it - Csak a felsorolt elemek. De itt mi vár még egy baj, a véleménynyilvánítás flag0 | flag1 (mint a többi bitenkénti műveletek felsorolások) int típusú, a második sor fog okozni a fordító hibát. Majd meg kell használni a leadott, de azt egyértelműen minden művelet a zászlók nem jobb, mint a boltban zászlók int:
Ön tudja elrejteni az ilyen típusú átalakítás a sajátosságai (nem a makró, illetve a teljes irányítást erdőtípusokat megy):
Írja ezeket a funkciókat néhány ésszerű számos érvet és használata:
Úgy tűnik, hogy nem is rossz - annak céljától, típusától biztonság, már elért. C ++, akkor még jobban - csak rányomják bélyegüket zászló enum és bit műveletek:
Hoz az érv, hogy egy int ebben az esetben van szükség, hogy nincs végtelen ciklus :) Most a zászlók sokkal könnyebb:
Az egyszerűség kedvéért a használatát túlterhelt szereplők zapihnom az enum-ok a makro:
Most, a használata típusbiztos zászló elég írni a következő transzferek és állítsa bites műveleteket is:
Ezeket a zászlókat, például kényelmesen használható elindítani a különböző perifériákat. Példa inicializálni USART modul STM32:
Mi a helyzet, ahol létre az alapítvány, a projekt építészeti, és annak teljes végrehajtását és azt kísérő többi ember? A kevésbé lesz lehetséges csavarja fel, annál nagyobb az esélye, hogy a projekt teljes lesz és ellentmondásmentes. Valószínűleg tapasztalni kis parancs működik :)
igen, van a legtöbb, hogy nem különösebben nagy
Ololo, én nem tévedtem csapatmunka?) Ami szóló architektúra, amely megvalósítja a többi, gyakran indiánok, én is gondoltam.
Explicit típus ebben az esetben lesz azonnal nyilvánvaló, és szemben a folyamatos tselotsislennoy könnyen talált keres reguláris kifejezések segítségével.
Ha lehet saját magát és másokat egy kicsit opezopasit az ilyen dolgok, és ez ingyenes, miért ne?
Nos, az egyszerűség beleértve elősegíti az olvashatóságot és támogathatóság. Kivéve persze egy egyszerű kivéve 0x2F helyett flag1 | flag2 | FlagN.
De a megértés szép - ez csak egy műszakilag elegáns és olvasható.
Nem kevésbé hatékony programok, és lehetővé teszi, hogy írjon a jó öreg C. És ha nem látja a különbséget ... nem kevésbé hatásos program lehetővé teszi, hogy írjon a jó öreg bináris gépi kódot. Nos, mi a jó én vezetek. De a C ++, a képes kezében ugyanaz C különbözik.
Ó, nézte a „egyszerűség” Azt akarom, hogy sírni. (
Bla, még egy kicsit a nyilvántartásban nem állapítható nélkül navertev kilométeres kagyló körül elemi operátor | =.
Szintén mellékelni értelmetlen korlátozások - ez nem a C-utat. Szintén nem juzat 0x2F helyett flag1 | flag2 | FlagN szüksége agyat znachntelno kisebb vkuril mindezen kibaszott dzsungel kód C ++.
Általában én veletek vagyok poputi. /
Nos, a szint a program kifejezetten csak lehetséges, és mellszobor (ha egyedül dolgoznak - egyébként ilyen trükk lehet folytatni kényszeríteni normális írni a többi). És itt a könyvtárban szinten már elég értelmes.
Például, az úton ítélve ő megjelenése, hiszen csak azért, mert UART könyvtárban.
Néhányszor a homlokon shmyaknut Claudia és írni. )
És még egyszer túlterhelés szabvány üzemeltetők nem kell feleslegesen. Nem kell, hogy a dolgok bonyolult és zavaros, egyszerűen azért, mert akkor.
Ha csak ez volt ilyen egyszerű, Wirth nem működött, az összes új nyelvek, amelyek nem engedik, hogy lőni magát a láb :)
Ha jól értem az angol szöveget, állítja unió-am, nem mond semmi újat.
És ez így egyértelmű, hogy az úszó bejegyzést a szakszervezet nem lehet olvasni, mint egy int a reményben, hogy egész részét. Még ha az unió áll úszót és int.
ps. ha használja anonim struktúra, a felvétel zászlók könnyebb
Mintegy Misr én nem tudok semmit, kivéve, hogy az.
Nem. Írásban lebegnek a szakszervezet, nem várhatjuk, hogy egy int elolvassa reinterpret_cast (float). És ha írsz flag.f = 0 - nincs garancia arra, hogy ezzel a lépéssel a bit zászlók. Igen, általában működik, de a szabvány szerint az UB.
Írásban lebegnek a szakszervezet, nem várhatjuk, hogy egy int elolvassa reinterpret_cast (float).
Nem világos, hogy mi szüksége lehet egy öntött. Van külön hozzáférést int és külön az úszó.
Vagy van, hogy lehetetlen pontosan meghatározni, mi is van tárolva az Unión belül bármikor - int vagy float? Wow.
lag.f = 0 - nincs garancia arra, hogy ezzel a lépéssel a bit zászlók. Igen, általában működik, de a szabvány szerint az UB. UB bitmezőkbe nem kisebb problémát hoz.