C Language
Door de implementatie bepaald gedrag
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 macroCHAR_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 danint main(int argc, char *arg[])
enint 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
enLDBL_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 alssigned char
of alsunsigned char
( 6.2.5 / 15 ). Kan worden opgevraagd metCHAR_MIN
, ofwel0
ofSCHAR_MIN
alschar
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 alsunsigned int
of alssigned int
( 6.7.2 / 5 ).Welke typen bitfields kunnen gebruiken, anders dan optioneel gekwalificeerde
_Bool
,signed int
enunsigned 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 danSTDC
( 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 doorfegetexceptflag()
( 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 doorsetlocale()
( 7.11.1.1/3 ).
Wiskundige functies
De typen die worden voorgesteld door
float_t
endouble_t
wanneer de macroFLT_EVAL_METHOD
een andere waarde heeft dan0
,1
en2
( 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 eenmath.h
( 7.12.1 / 2 ).De waarde die wordt geretourneerd door
math.h
Functioneert in het geval van eenmath.h
( 7.12.1 / 3 ).De waarde die wordt geretourneerd door
math.h
functioneert wanneer het resultaatmath.h
, en aspecten oferrno
is ingesteld opERANGE
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 eenfmod()
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 eenremquo()
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
enSIGSEGV
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 descanf()
-familiefuncties ( 7.21.6.2/12 ).De
errno
waarde ingesteld doorfgetpos()
bij mislukking ( 7.21.9.1/2 ).De
errno
waarde ingesteld doorfsetpos()
bij fout ( 7.21.9.3/2 ).De
errno
waarde ingesteld doorftell()
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()
-familiefunctieserrno
opERANGE
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
entime_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 tijdbasisTIME_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 dewscanf()
-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()
-familieerrno
opERANGE
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.