Paras vastaus
Hyvin hankala hämmennys, kun rakennerajat on sovitettava koneen rajojen tai verkkoprotokollien yli . Teknisen asiantuntijan mukaan koon on oltava vähimmäisvaatimus suurimman mahdollisen arvon edustamiseksi. Joten esimerkiksi tyypillinen tilakoneen tilaluettelo saattaa edellyttää vain tavua.
AFAIK: lla on vain kolme tapaa hallita kokoa:
joillakin (mutta ei kaikilla) kääntäjillä on kääntäjäkytkin pakottaa koon joko sizeof (int) tai 32 bittiä. Kytkimen syntaksi ei ole sama sanojen MSC ja gccc / clang välillä.
Toinen tapa, jos sinun on täytettävä sanoa 16-bittinen kenttä, on määritellä näennäisarvo, joka vaatii kyseisen koon.
Toinen tapa on käyttää säännöllisiä int-tyylejä rakennemääritelmissä, mutta sitten hylätään virheenkorjauksen mukavuus, jos se näyttää arvon enum-nimellä ja saa vain kokonaislukuja.
Tällöin luultavasti joudutaan määrittelemään rakenne, joka sisältää luettelon, on pakattu, ei pehmustettu.
Vastaa
Jos jossakin muuttujassa ei ole osaa x
on const
tai volatile
, ja x
ei ole taulukotyyppiä, sitten lause …
x = x;
… ei melkein tee mitään. Se on hyvin muodostettu. Olettaen, että x
alustettiin etukäteen, ¹ se on myös hyvin määritelty. Tehtävä ei ole t todella muuta ohjelman tilaa muutamalla mahdollisella poikkeuksella (katso alla).
Tämä on totta, vaikka x
: llä on struct
-tyyppi.
struct foo {
char buf[42];
int x;
};
struct foo x = { "Hello World", 18 };
x = x; // no big deal.
Joten mikä ”virhe” on? Se ei ole hyödyllinen koodi, mutta koodiin mahtuu melko paljon kuvausta. Se on vain virhe , jos pyrkisit tekemään jotain muuta ja jäisit väliin.
[Lisäys: Ottaen huomioon tämän tehtävän hyödyttömyyden, kääntäjät ovat halukkaita varoittamaan siitä, koska se on todennäköisesti sinun teit tarkoittaa jotain muuta.]
Miksi bitti const
ja volatile
? Rajoitus kohteelle const
on yksinkertainen: se tarkoittaa ”vain luku”, joten et voi kirjoittaa sille. Ainakin, ei yksinkertaisella toimeksiannolla.
volatile
-asiakirja on hankalampi. Kyseinen avainsana sanoo, että sen määrittelemää arvoa voidaan muuttaa tavoilla, joita toteutus ei näe, ja että sille kirjoitettavilla kirjoituksilla voi olla sivuvaikutuksia. Kaivamatta rathole tässä, käytännössä ainoat kohtuullisen tarkasti määritellyt toiminnot, jotka voit suorittaa haihtuvalle objektille, näyttävät tältä:
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.
Voit tehdä hieman enemmän kuin sanely sanalla volatile
, mutta vain vähän. Se on toisen päivän aihe. Siihen on syy, että C ++ 20 hylkäsi kaikki muut lukuun ottamatta volatile
-käyttöä. Heidän muutoksensa näyttävät melko järkeviltä.
Mainitsin yllä muutaman mahdollisen poikkeuksen. Jonas Oberhauser muistutti minua siitä, että kaikki struct
-pehmusteet on , joita tämä tehtävä ei välttämättä säilytä.
On myös teoreettisesti mahdollista, että objektien -esitys voi muuttua toimeksiannosta johtuen, jos sama arvo voidaan esittää usealla tavalla.
Toivottavasti ohjelmasi on epäherkkä molemmille mahdollisuuksille. Jos kuitenkin joskus tarkastelet objektin taustalla olevaa -esitystä, saatat nähdä eroja. Esimerkiksi toiminnot, kuten memcmp
, saattavat huomata. Vastaavasti, jos käytät -tyyppistä työntöä.
¹ Ja jos ei, tervetuloa käyttämään määrittelemätöntä käyttäytymistä, koska olet todennäköisesti törmännyt johonkin näistä:
- Automaattisen tallennuksen kestoa käyttävän objektin arvoa käytetään, kun se on määrittelemätön ( 6.2 .4 , 6.7.9 , 6.8 ).
- Arvoa, joka määrittelee automaattisen tallennuksen keston objektin, joka olisi voitu ilmoittaa rekisterin tallennustilaluokan kanssa, käytetään kontekstissa, määritetyn objektin arvo, mutta objekti on alustamaton. ( 6.3.2.1 ).