Zoeken…


Opmerkingen

Overzicht

De C-standaard beschrijft de taalsyntaxis, de functies van de standaardbibliotheek en het gedrag van conforme C-processors (grofweg compilers) en conforme C-programma's. Met betrekking tot gedrag specificeert de standaard voor het grootste deel bepaald gedrag voor programma's en verwerkers. Aan de andere kant hebben sommige bewerkingen expliciet of impliciet ongedefinieerd gedrag - dergelijke bewerkingen moeten altijd worden vermeden, omdat u er op niets op kunt vertrouwen. Tussendoor zijn er verschillende door de implementatie gedefinieerde gedragingen. Dit gedrag kan variëren tussen C-processors, runtimes en standaardbibliotheken (gezamenlijk implementaties ), maar ze zijn consistent en betrouwbaar voor elke gegeven implementatie en conforme implementaties documenteren hun gedrag op elk van deze gebieden.

Het is soms redelijk dat een programma vertrouwt op door de implementatie bepaald gedrag. Als het programma bijvoorbeeld hoe dan ook specifiek is voor een bepaalde besturingsomgeving, is het onwaarschijnlijk dat het een probleem is om te vertrouwen op door de implementatie gedefinieerd gedrag dat algemeen is voor de gemeenschappelijke processors voor die omgeving. Als alternatief kan men voorwaardelijke compilatierichtlijnen gebruiken om door de implementatie gedefinieerd gedrag te selecteren dat geschikt is voor de gebruikte implementatie. In elk geval is het essentieel om te weten welke operaties door de implementatie gedefinieerd gedrag hebben, om ze te vermijden of een weloverwogen beslissing te nemen over of en hoe ze te gebruiken.

De balans van deze opmerkingen vormt een lijst van alle door de implementatie gedefinieerde gedragingen en kenmerken gespecificeerd in de C2011-standaard, met verwijzingen naar de standaard. Velen van hen gebruiken de terminologie van de standaard . Sommige anderen vertrouwen meer in het algemeen op de context van de standaard, zoals de acht fasen van het vertalen van broncode in een programma, of het verschil tussen gehoste en vrijstaande implementaties. Sommige die bijzonder verrassend of opmerkelijk zijn, worden vetgedrukt weergegeven. Niet alle beschreven gedragingen worden ondersteund door eerdere C-normen, maar over het algemeen hebben ze door de implementatie gedefinieerd gedrag in alle versies van de norm die hen ondersteunen.

Programma's en processors

Algemeen

  • Het aantal bits in één byte ( 3.6 / 3 ). Ten minste 8 kan de werkelijke waarde worden opgevraagd met de macro CHAR_BIT .

  • Welke uitvoerberichten worden beschouwd als "diagnostische berichten" ( 3.10 / 1 )

Bron vertaling

  • De manier waarop multibyte-tekens uit het fysieke bronbestand worden toegewezen aan de brontekenset ( 5.1.1.2/1 ).

  • Of niet-lege reeksen niet-nieuwe regel witruimte worden vervangen door enkele spaties tijdens vertaalfase 3 ( 5.1.1.2/1 )

  • De uitvoering-set tekens waarnaar tekenliteralen en tekens in tekenreeksconstanten worden geconverteerd (tijdens vertaalfase 5) wanneer er anders geen overeenkomstig teken is ( 5.1.1.2/1 ).

Operationele omgeving

  • De manier waarop de te verzenden diagnostische berichten worden geïdentificeerd ( 5.1.1.3/1 ).

  • De naam en het type van de functie die wordt aangeroepen bij het opstarten in een vrijstaande implementatie ( 5.1.2.1/1 ).

  • Welke bibliotheekfaciliteiten zijn beschikbaar in een vrijstaande implementatie, voorbij een gespecificeerde minimale set ( 5.1.2.1/1 ).

  • Het effect van programma-beëindiging in een vrijstaande omgeving ( 5.1.2.1/2 ).

  • In een gehoste omgeving, alle toegestane handtekeningen voor de functie main() anders dan int main(int argc, char *arg[]) en int main(void) ( 5.1.2.2.1 / 1 ).

  • De manier waarop een gehoste implementatie de tekenreeksen definieert waarnaar het tweede argument verwijst naar main() ( 5.1.2.2.1 / 2 ).

  • Wat is een "interactief apparaat" in het kader van de paragrafen 5.1.2.3 (Programma-uitvoering) en 7.21.3 (Bestanden) ( 5.1.2.3/7 ).

  • Eventuele beperkingen op objecten waarnaar door rout -afhandelingsroutines wordt verwezen in een optimaliserende implementatie ( 5.1.2.3/10 ).

  • In een vrijstaande implementatie, of meerdere threads van uitvoering worden ondersteund ( 5.1.2.4/1 ).

  • De waarden van de leden van de uitvoeringstekenset ( 5.2.1 / 1 ).

  • De char waarden die overeenkomen met de gedefinieerde alfabetische escape-reeksen ( 5.2.2 / 3 ).

  • De numerieke limieten en karakteristieken van gehele getallen en drijvende komma's ( 5.2.4.2/1 ).

  • De nauwkeurigheid van rekenkundige drijvende-kommabewerkingen en van de conversies van de standaardbibliotheek van interne drijvende komma-representaties naar string-representaties ( 5.2.4.2.2 / 6 ).

  • De waarde van macro FLT_ROUNDS , die de standaardafrondingsmodus met drijvende komma codeert ( 5.2.4.2.2 / 8 ).

  • Het afrondingsgedrag gekenmerkt door ondersteunde waarden van FLT_ROUNDS groter dan 3 of kleiner dan -1 ( 5.2.4.2.2 / 8 ).

  • De waarde van macro FLT_EVAL_METHOD , die het gedrag van de drijvende komma-evaluatie karakteriseert ( 5.2.4.2.2 / 9 ).

  • Het gedrag wordt gekenmerkt door ondersteunde waarden van FLT_EVAL_METHOD minder dan -1 ( 5.2.4.2.2 / 9 ).

  • De waarden van macro's FLT_HAS_SUBNORM , DBL_HAS_SUBNORM en LDBL_HAS_SUBNORM , die karakteriseren of de standaard drijvende-komma-indelingen subnormale getallen ondersteunen ( 5.2.4.2.2 / 10 )

Types

  • Het resultaat van een poging (indirect) toegang te krijgen tot een object met threadopslagduur van een andere thread dan degene waaraan het object is gekoppeld ( 6.2.4 / 4 )

  • De waarde van een char waaraan een teken buiten de basisuitvoeringsset is toegewezen ( 6.2.5 / 3 ).

  • De ondersteunde uitgebreide getekende integer-typen, indien aanwezig, ( 6.2.5 / 4 ), en eventuele extensie-trefwoorden die worden gebruikt om ze te identificeren.

  • Of char dezelfde weergave en hetzelfde gedrag heeft als signed char of als unsigned char ( 6.2.5 / 15 ). Kan worden opgevraagd met CHAR_MIN , ofwel 0 of SCHAR_MIN als char is ondertekend of ondertekend.

  • Het aantal, de volgorde en de codering van bytes in de representaties van objecten , behalve waar expliciet gespecificeerd door de standaard ( 6.2.6.1/2 ).

  • Welke van de drie erkende vormen van gehele getallenrepresentatie is van toepassing in elke gegeven situatie en of bepaalde bitpatronen van gehele getallenobjecten valrepresentaties zijn ( 6.2.6.2/2 ).

  • De uitlijningsvereiste van elk type ( 6.2.8 / 1 ).

  • Of en in welke contexten uitgebreide uitlijningen worden ondersteund ( 6.2.8 / 3 ).

  • De set ondersteunde uitgebreide uitlijningen ( 6.2.8 / 4 ).

  • De conversie van gehele getallen van alle uitgebreide getekende typen integer ten opzichte van elkaar ( 6.3.1.1/1 ).

  • Het effect van het toewijzen van een waarde buiten bereik aan een geheel getal met teken ( 6.3.1.3/3 ).

  • Wanneer een binnen bereik maar niet-representatieve waarde wordt toegewezen aan een object met drijvende komma, hoe de in het object opgeslagen representatieve waarde wordt gekozen uit de twee dichtstbijzijnde representatieve waarden ( 6.3.1.4/2 ; 6.3.1.5/1 ; 6.4.4.2 / 3 ).

  • Het resultaat van het converteren van een geheel getal naar een type aanwijzer , behalve voor constante uitdrukkingen van gehele getallen met waarde 0 ( 6.3.2.3/5 ).

Bron vorm

  • De locaties in #pragma richtlijnen waar #pragma worden herkend ( 6.4 / 4 ).

  • De tekens, inclusief multibyte-tekens, met uitzondering van het onderstrepingsteken, niet-gecentreerde Latijnse letters, universele tekennamen en decimale cijfers die in identifiers kunnen voorkomen ( 6.4.2.1/1 ).

  • Het aantal significante tekens in een ID ( 6.4.2.1/5 ).

  • Op enkele uitzonderingen na, de manier waarop de brontekens in een constante van een geheel getal worden toegewezen aan door de uitvoering ingestelde tekens ( 6.4.4.4/2 ; 6.4.4.4/10 ).

  • De huidige landinstelling die wordt gebruikt voor het berekenen van de waarde van een brede tekenconstante , en de meeste andere aspecten van de conversie voor veel van dergelijke constanten ( 6.4.4.4/11 ).

  • Of verschillend vooraf bepaalde letterreeksen met brede tekenreeks kunnen worden samengevoegd en, zo ja, de behandeling van de resulterende multibyte-tekenreeks ( 6.4.5 / 5 )

  • De locale die tijdens de vertaalfase 7 werd gebruikt om lettertypen met brede tekenreeksen om te zetten in reeksen van multibyte tekens, en hun waarde wanneer het resultaat niet kan worden weergegeven in de uitvoeringstekenset ( 6.4.5 / 6 ).

  • De manier waarop kopnamen worden toegewezen aan bestandsnamen ( 6.4.7 / 2 ).

evaluatie

  • Of en hoe drijvende komma-uitdrukkingen worden gecontracteerd wanneer FP_CONTRACT niet wordt gebruikt ( 6.5 / 8 ).

  • De waarden van de resultaten van de operators sizeof en _Alignof ( 6.5.3.4/5 ).

  • De grootte van het resultatentype van pointer-aftrekking ( 6.5.6 / 9 ).

  • Het resultaat van het naar rechts verschuiven van een ondertekend geheel getal met een negatieve waarde ( 6.5.7 / 5 ).

Looptijd gedrag

  • De mate waarin het trefwoord van het register effectief is ( 6.7.1 / 6 ).

  • Of het type bitveld dat als int wordt aangegeven, hetzelfde is als unsigned int of als signed int ( 6.7.2 / 5 ).

  • Welke typen bitfields kunnen gebruiken, anders dan optioneel gekwalificeerde _Bool , signed int en unsigned int ; of bitvelden atomaire typen kunnen hebben ( 6.7.2.1/5 ).

  • Aspecten van hoe implementaties de opslag voor bitfields indelen ( 6.7.2.1/11 ).

  • De uitlijning van niet-bitveldleden van structuren en vakbonden ( 6.7.2.1/14 ).

  • Het onderliggende type voor elk opgesomd type ( 6.7.2.2/4 ).

  • Wat is een "toegang" tot een object van het volatile type ( 6.7.3 / 7 ).

  • De effectiviteit van inline functieverklaringen ( 6.7.4 / 6 ).

preprocessor

  • Of tekenconstanten in voorwaardelijke voorwaardes op dezelfde manier worden omgezet in gehele getallen als in gewone uitdrukkingen, en of een constante van één teken een negatieve waarde kan hebben ( 6.10.1 / 4 ).

  • De locaties zochten naar bestanden die zijn aangewezen in een #include instructie ( 6.10.2 / 2-3 ).

  • De manier waarop een kopnaam wordt gevormd uit de tokens van een multi-token #include instructie ( 6.10.2 / 4 ).

  • De limiet voor #include nesting ( 6.10.2 / 6 ).

  • Of een \ -teken wordt ingevoegd vóór de \ die een universele tekennaam introduceert in het resultaat van de operator # van de preprocessor ( 6.10.3.2/2 ).

  • Het gedrag van de #pragma preprocessing-richtlijn voor andere pragma's dan STDC ( 6.10.6 / 1 ).

  • De waarde van de macro's __DATE__ en __TIME__ als er respectievelijk geen datum of tijd voor vertaling beschikbaar is ( 6.10.8.1/1 ).

  • De interne tekencodering die wordt gebruikt voor wchar_t als macro __STDC_ISO_10646__ niet is gedefinieerd ( 6.10.8.2/1 ).

  • De interne tekencodering die wordt gebruikt voor char32_t als macro __STDC_UTF_32__ niet is gedefinieerd ( 6.10.8.2/1 ).

Standaard bibliotheek

Algemeen

  • De indeling van de berichten die worden verzonden wanneer beweringen mislukken ( 7.2.1.1/2 ).

Floating-point omgevingsfuncties

  • Eventuele extra uitzonderingen met drijvende komma die verder gaan dan gedefinieerd door de standaard ( 7.6 / 6 ).

  • Extra afrondingsmodi met drijvende komma boven de standaard ( 7.6 / 8 ).

  • Eventuele extra drijvende komma-omgevingen die verder gaan dan gedefinieerd door de standaard ( 7.6 / 10 ).

  • De standaardwaarde van de drijvende-kommagetoegangsschakelaar ( 7.6.1 / 2 ).

  • De weergave van de fegetexceptflag() drijvende komma geregistreerd door fegetexceptflag() ( 7.6.2.2/1 ).

  • Of de functie feraiseexcept() bovendien de "onnauwkeurige" drijvende-komma-uitzondering verhoogt wanneer deze de "overloop" of "underflow" drijvende-komma-uitzondering verhoogt ( 7.6.2.3/2 ).

Landgebonden functies

  • De locale strings anders dan "C" ondersteund door setlocale() ( 7.11.1.1/3 ).

Wiskundige functies

  • De typen die worden voorgesteld door float_t en double_t wanneer de macro FLT_EVAL_METHOD een andere waarde heeft dan 0 , 1 en 2 ( 7.12 / 2 ).

  • Ondersteunde drijvende komma-classificaties die verder gaan dan die welke door de standaard zijn gedefinieerd ( 7.12 / 6 ).

  • De waarde die door math.h geretourneerd bij een math.h ( 7.12.1 / 2 ).

  • De waarde die wordt geretourneerd door math.h Functioneert in het geval van een math.h ( 7.12.1 / 3 ).

  • De waarde die wordt geretourneerd door math.h functioneert wanneer het resultaat math.h , en aspecten of errno is ingesteld op ERANGE en of er een drijvende-komma-uitzondering wordt opgeworpen in die omstandigheden ( 7.12.1 / 6 ).

  • De standaardwaarde van de FP-contractieschakelaar ( 7.12.2 / 2 ).

  • Of de functies fmod() 0 retourneren of een fmod() genereren wanneer hun tweede argument 0 is ( 7.12.10.1/3 ).

  • Of de remainder() functies 0 retourneren of een domeinfout genereren wanneer hun tweede argument 0 is ( 7.12.10.2/3 ).

  • Het aantal significante bits in de quotiëntmoduli berekend door de remquo() -functies ( 7.12.10.3/2 ).

  • Of de remquo() -functies 0 retourneren of een remquo() genereren wanneer hun tweede argument 0 is ( 7.12.10.3/3 ).

signalen

  • De complete set ondersteunde signalen, hun semantiek en hun standaardverwerking ( 7.14 / 4 ).

  • Wanneer een signaal wordt gegenereerd en er is een aangepaste handler gekoppeld aan dat signaal, welke signalen, indien aanwezig, worden geblokkeerd voor de duur van de uitvoering van de handler ( 7.14.1.1/3 ).

  • Welke signalen anders dan SIGFPE , SIGILL en SIGSEGV veroorzaken dat het gedrag bij terugkeer van een aangepaste signaalhandler ongedefinieerd is ( 7.14.1.1/3 ).

  • Welke signalen zijn in eerste instantie geconfigureerd om te worden genegeerd (ongeacht hun standaardverwerking; 7.14.1.1/6 ).

Diversen

  • De specifieke nulaanwijzerconstante waarnaar macro NULL uitgebreid ( 7.19 / 3 ).

Bestandsverwerkingsfuncties

  • Of de laatste regel van een tekststream een afsluitende nieuwe regel vereist ( 7.21.2 / 2 ).

  • Het aantal lege tekens dat automatisch wordt toegevoegd aan een binaire stream ( 7.21.2 / 3 ).

  • De beginpositie van een bestand dat is geopend in de append-modus ( 7.21.3 / 1 ).

  • Of een schrijfbewerking op een tekststream ervoor zorgt dat de stream wordt afgekapt ( 7.21.3 / 2 ).

  • Ondersteuning voor streambuffering ( 7.21.3 / 3 ).

  • Of bestanden met lengte nul echt bestaan ( 7.21.3 / 4 ).

  • De regels voor het samenstellen van geldige bestandsnamen ( 7.21.3 / 8 ).

  • Of hetzelfde bestand meerdere keren tegelijkertijd kan worden geopend ( 7.21.3 / 8 ).

  • De aard en keuze van codering voor multibyte-tekens ( 7.21.3 / 10 ).

  • Het gedrag van de functie remove() wanneer het doelbestand is geopend ( 7.21.4.1/2 ).

  • Het gedrag van de functie rename rename() wanneer het doelbestand al bestaat ( 7.21.4.2/2 ).

  • Of bestanden die zijn gemaakt via de functie tmpfile() worden verwijderd in het geval dat het programma abnormaal wordt beëindigd ( 7.21.4.3/2 ).

  • Welke modus verandert onder welke omstandigheden is toegestaan via freopen() ( 7.21.5.4/3 ).

I / O-functies

  • Welke van de toegestane representaties van oneindige en niet-aantal FP-waarden worden geproduceerd door de printf () - family-functies ( 7.21.6.1/8 ).

  • De manier waarop pointers worden opgemaakt door de printf() -familiefuncties ( 7.21.6.1/8 ).

  • Het gedrag van scanf() -familie functioneert wanneer het - teken verschijnt in een interne positie van de scanlijst van een [ veld ( 7.21.6.2/12 ).

  • De meeste aspecten van de overdracht van p velden door de scanf() -familiefuncties ( 7.21.6.2/12 ).

  • De errno waarde ingesteld door fgetpos() bij mislukking ( 7.21.9.1/2 ).

  • De errno waarde ingesteld door fsetpos() bij fout ( 7.21.9.3/2 ).

  • De errno waarde ingesteld door ftell() bij mislukking ( 7.21.9.4/3 ).

  • De betekenis van de strtod() -familiefuncties van sommige ondersteunde aspecten van een NaN-opmaak ( 7.22.1.3p4 ).

  • Of de strtod() -familiefuncties errno op ERANGE als het resultaat onderloopt ( 7.22.1.3/10 ).

Geheugentoewijzingsfuncties

  • Het gedrag van de geheugentoewijzingsfuncties wanneer het aantal aangevraagde bytes 0 is ( 7.22.3 / 1 ).

Systeemomgeving functies

  • Welke opschoonacties worden uitgevoerd en welke status wordt naar het host-besturingssysteem geretourneerd wanneer de functie abort() wordt aangeroepen ( 7.22.4.1/2 ).

  • Welke status wordt teruggegeven aan de hostomgeving wanneer exit() wordt genoemd ( 7.22.4.4/5 ).

  • De verwerking van open streams en welke status wordt geretourneerd naar de hostomgeving wanneer _Exit() wordt aangeroepen ( 7.22.4.5/2 ).

  • De set omgevingsnamen toegankelijk via getenv() en de methode voor het wijzigen van de omgeving ( 7.22.4.6/2 ).

  • De retourwaarde van de functie system() ( 7.22.4.8/3 ).

Datum- en tijdfuncties

  • De lokale tijdzone en de zomertijd ( 7.27.1 / 1 ).

  • Het bereik en de precisie van tijden die kunnen worden weergegeven via de typen clock_t en time_t ( 7.27.1 / 4 ).

  • Het begin van het tijdperk dat dient als referentie voor de tijden die worden geretourneerd door de functie clock() ( 7.27.2.1/3 ).

  • Het begin van het tijdperk dat dient als referentie voor de tijden die worden geretourneerd door de functie timespec_get() (wanneer de tijdbasis TIME_UTC ; 7.27.2.5/3 ).

  • De strftime() vervanging voor de %Z conversiespecificatie in de "C" locale ( 7.27.3.5/7 ).

Brede karakter I / O-functies

  • Welke van de toegestane representaties van oneindige en niet-een-nummer FP-waarden worden geproduceerd door de wprintf() -familiefuncties ( 7.29.2.1/8 ).

  • De manier waarop pointers worden opgemaakt door de wprintf() -family ( 7.29.2.1/8 ).

  • Het gedrag van wscanf() -familie functioneert wanneer het - teken verschijnt in een interne positie van de scanlijst van een [ veld ( 7.29.2.2/12 ).

  • De meeste aspecten van de overdracht van p velden door de wscanf() -familiefuncties ( 7.29.2.2/12 ).

  • De betekenis voor de wstrtod() -familiefuncties van sommige ondersteunde aspecten van NaN-opmaak ( 7.29.4.1.1 / 4 ).

  • Of de wstrtod() -familie errno op ERANGE als het resultaat onderloopt ( 7.29.4.1.1 / 10 ).

Rechts verschuiving van een negatief geheel getal

int signed_integer = -1;

// The right shift operation exhibits implementation-defined behavior:
int result = signed_integer >> 1;

Een waarde buiten bereik toewijzen aan een geheel getal

// Supposing SCHAR_MAX, the maximum value that can be represented by a signed char, is
// 127, the behavior of this assignment is implementation-defined:
signed char integer;
integer = 128;

Nulbytes toewijzen

// The allocation functions have implementation-defined behavior when the requested size
// of the allocation is zero.
void *p = malloc(0);

Vertegenwoordiging van ondertekende gehele getallen

Elk type met geheel getal kan worden weergegeven in een van de drie indelingen; het is door de implementatie bepaald welke wordt gebruikt. De implementatie die wordt gebruikt voor elk gegeven geheel getal met teken dat minstens zo breed is als int kan tijdens runtime worden bepaald uit de twee laagste orde bits van de weergave van waarde -1 in dat type, als volgt:

enum { sign_magnitude = 1, ones_compl = 2, twos_compl = 3, };
#define SIGN_REP(T) ((T)-1 & (T)3)

switch (SIGN_REP(long)) {
   case sign_magnitude: { /* do something */ break; }
   case ones_compl:     { /* do otherwise */ break; }
   case twos_compl:     { /* do yet else  */ break; }
   case 0:  { _Static_assert(SIGN_REP(long), "bogus sign representation"); }
}

Hetzelfde patroon is van toepassing op de weergave van smallere typen, maar ze kunnen niet worden getest met deze techniek omdat de operanden van & zijn onderworpen aan "de gebruikelijke rekenkundige conversies" voordat het resultaat wordt berekend.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow