Cel mai bun răspuns
O enigmă foarte spinoasă, când trebuie să se potrivească compensările de structură peste limitele mașinii sau protocoalele de rețea . Specificația spune că dimensiunea trebuie să fie cea minimă necesară pentru a reprezenta cea mai mare valoare pe care o poate lua. Deci, o enumere tipică de stare a mașinii de stare, de exemplu, ar putea necesita doar un octet.
Există AFAIK doar trei moduri de a controla dimensiunea:
unele (dar nu toate) compilatoarele au un comutator de comutare pentru a forța dimensiunea fie la sizeof (int), fie la 32 de biți. Sintaxa comutatorului nu este aceeași între MSC și gccc / clang.
A doua modalitate, dacă trebuie să completați un câmp de 16 biți, este să definiți o valoare maximă falsă care necesită acea dimensiune.
Cealaltă modalitate este de a utiliza stiluri int obișnuite în definițiile structurilor, dar apoi se renunță la comoditatea depanatorului de a-i arăta valoarea după numele enum și se obțin doar numere întregi.
Apoi, probabil că va trebui să specificați structura care conține enum-ul este ambalat, nu căptușit.
Răspuns
Dacă nu există nicio parte a unei variabile x
este const
sau volatile
și x
nu este de tip tablou, apoi declarația …
x = x;
… aproape că nu face nimic. Este „bine format. Presupunând că x
a fost inițializat în prealabil, ¹ este, de asemenea, bine definit. Schimbă într-adevăr starea programului, cu câteva potențiale excepții (vezi mai jos).
Acest lucru este adevărat chiar dacă x
are un struct
tip.
struct foo {
char buf[42];
int x;
};
struct foo x = { "Hello World", 18 };
x = x; // no big deal.
Deci, care este „greșeala”? Nu este util cod, dar există destul de multe coduri care se potrivesc acelei descrieri. Este doar o greșeală dacă intenționați să faceți altceva și ați ratat.
[Addendum: Având în vedere inutilitatea acestei misiuni, compilatoarele sunt înclinate să avertizeze în legătură cu aceasta, întrucât este foarte probabil id = „af7847d40e”>