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:
- Az automatikus tárolási időtartamú objektum értékét használjuk, amíg meghatározatlan ( 6.2 .4 , 6.7.9 , 6.8 ).
- Egy olyan lvalue értéket jelöl, amely automatikus tárolási időtartamú objektumot jelenthetett be a regiszter tároló osztályával, olyan környezetben használják, amely megköveteli a a kijelölt objektum értéke, de az objektum nem inicializált. ( 6.3.2.1 ).