Mekkora az enum a C-ben?


Legjobb válasz

Nagyon tökös rejtvény, amikor a szerkezeti eltolásoknak a géphatárokon vagy a hálózati protokollokon keresztül kell egyeztetniük . A specifikáció szerint a méretnek minimálisan szükségesnek kell lennie ahhoz, hogy a lehető legnagyobb értéket képviselje. Tehát egy tipikus állapotgép-állapotállapot például csak bájtot igényel.

Az AFAIK-nak csak három módja van a méret ellenőrzésére:

néhány (de nem az összes) fordító rendelkezik egy fordító kapcsoló a méret kényszerítésére (size) (int) vagy 32 bitre. A kapcsoló szintaxisa nem azonos a mondjuk az MSC és a gccc / clang között.

A második módszer, ha mondjuk egy 16 bites mezőt kell kitölteni, az a dummy max érték meghatározása, amely megköveteli ezt a méretet.

A másik módszer a reguláris int stílusok használata a struktúradefiníciókban, de ezután eltekint a hibakereső kényelmétől, ha az értéket enum név szerint jeleníti meg, és csak egész számokat kap helyette.

Ezután valószínűleg meg kell adni azt a struktúrát, amely az enumot tartalmazza, és nincs kitöltve.

Válasz

Ha valamelyik változónak nincs része x const vagy volatile, és a x nem tömb típusú, akkor a kijelentés…

x = x;

… nagyjából nem csinál semmit. Jól van kialakítva. Feltéve, hogy a x elemet előzetesen inicializálták, ¹ ez is jól meghatározott. A hozzárendelés nem Nem változtat igazán a program állapotán, néhány lehetséges kivétellel (lásd alább).

Ez akkor is igaz, ha a x struct típus.

struct foo {

char buf[42];

int x;

};

struct foo x = { "Hello World", 18 };

x = x; // no big deal.

Tehát mi a „hiba”? Ez nem hasznos kód, de meglehetősen sok kód felel meg ennek a leírásnak. Csak hiba , ha valami mást szeretett volna tenni, és elmulasztotta.

[Kiegészítés: Tekintettel ennek a feladatnak a haszontalanságára, a fordítók hajlandók figyelmeztetni erre, mivel valószínűleg “te tetted mást jelent.]

Miért a const és a ? Az const korlátozása egyszerű: csak olvashatót jelent, és így nem írhat rá. Legalábbis nem egyszerű hozzárendeléssel.

A volatile -et illetően trükkösebb. Ez a kulcsszó azt mondja, hogy az általa minősített érték olyan módon módosulhat, amelyet a megvalósítás nem lát, és hogy a hozzá írásoknak lehetnek mellékhatásai. Anélkül, hogy itt rathole-ba ásna, a gyakorlatban az egyetlen ésszerűen definiált művelet, amelyet végrehajthat egy illékony objektumon, így néz ki:

volatile int v;

int i;

i = v; // reads from v once, places into i.

v = i; // writes to v once with the contents of i.

Ennél valamivel többet tehet a volatile segítségével, de csak kissé. Ez egy másik nap témája. Ennek oka van, hogy a C ++ 20 elavult a volatile néhány kivételével. Változásaik meglehetősen értelmesnek tűnnek.

Fentebb néhány kivételt említettem. Jonas Oberhauser emlékeztetett arra, hogy a struct minden kitöltését nem feltétlenül őrzi meg a feladat.

Elméletileg lehetséges az is, hogy az objektumok alapjellemzője megváltozhat a hozzárendelés miatt, ha ugyanaz az érték többféleképpen is megjeleníthető.

Remélhetőleg programja érzéketlen mindkét lehetőségre. Ha mégis megnézi az objektum mögöttes ábrázolást, akkor különbségeket tapasztalhat. Például a memcmp funkciók észrevehetik. Hasonlóképpen, ha típusú futtatást alkalmaz.

¹ Ha pedig nem ez volt, üdvözöljük a undefined viselkedésben, / a> mivel valószínűleg szembeszegül a következők egyikével:

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük