Sök…


Anmärkningar

Översikt

C-standarden beskriver språksyntaxen, funktionerna som tillhandahålls av standardbiblioteket och beteendet hos överensstämmande C-processorer (grovt sett, kompilatorer) och överensstämmande C-program. När det gäller beteende anger standarden för det mesta vissa beteenden för program och processorer. Å andra sidan har vissa operationer uttryckligt eller implicit odefinierat beteende - sådana operationer måste alltid undvikas, eftersom du inte kan lita på något om dem. Däremellan finns det en mängd olika implementeringsdefinerade beteenden. Dessa beteenden kan variera mellan C-processorer, driftstider och standardbibliotek (tillsammans, implementeringar ), men de är konsekventa och pålitliga för varje given implementering, och överensstämmande implementeringar dokumenterar deras beteende inom vart och ett av dessa områden.

Det är ibland rimligt att ett program förlitar sig på implementeringsdefinerat beteende. Till exempel, om programmet ändå är specifikt för en viss driftmiljö, är det osannolikt att det är ett problem att förlita sig på implementeringsdefinerade beteenden som är generella för de gemensamma processorerna för den miljön. Alternativt kan man använda villkorade sammanställningsdirektiv för att välja implementeringsdefinerade beteenden som är lämpliga för implementeringen som används. I vilket fall som helst är det viktigt att veta vilka operationer som har implementeringsdefinerat beteende, för att antingen undvika dem eller fatta ett informerat beslut om och hur man använder dem.

Balansen mellan dessa anmärkningar utgör en lista över alla implementeringsdefinerade beteenden och egenskaper som anges i C2011-standarden, med referenser till standarden. Många av dem använder standarden . Vissa andra förlitar sig mer generellt på konteksten av standarden, till exempel de åtta stegen för att översätta källkoden till ett program, eller skillnaden mellan värd och fristående implementationer. Vissa som kan vara särskilt överraskande eller anmärkningsvärda presenteras med fet typsnitt. Inte allt beteende som beskrivs stöds av tidigare C-standarder, men generellt sett har de implementeringsdefinerat beteende i alla versioner av standarden som stöder dem.

Program och processorer

Allmän

  • Antalet bitar i en byte ( 3,6 / 3 ). Minst 8 kan det verkliga värdet ifrågasättas med makro CHAR_BIT .

  • Vilka utgående meddelanden betraktas som "diagnostiska meddelanden" ( 3.10 / 1 )

Källöversättning

  • Det sätt på vilket fysiska källfils multibytatecken mappas till källteckenuppsättningen ( 5.1.1.2/1 ).

  • Huruvida icke-tomma sekvenser av icke-ny linje whitespace ersätts av enstaka mellanslag under översättningsfas 3 ( 5.1.1.2/1 )

  • Exekveringsuppsättningstecken ( -tecknen ) till vilka teckenbokstäver och tecken i strängkonstanter konverteras (under översättningsfas 5) när det annars inte finns något motsvarande tecken ( 5.1.1.2/1 ).

Driftsmiljö

  • Det sätt på vilket de diagnostiska meddelandena som ska sändas identifieras ( 5.1.1.3/1 ).

  • Namnet och typen av den funktion som anropas vid start i en fristående implementering ( 5.1.2.1/1 ).

  • Vilka biblioteksfaciliteter finns tillgängliga i en fristående implementering, utöver en specificerad minimal uppsättning ( 5.1.2.1/1 )

  • Effekten av programavslut i en fristående miljö ( 5.1.2.1/2 ).

  • I en värdmiljö är alla tillåtna signaturer för main() -funktionen annan än int main(int argc, char *arg[]) och int main(void) ( 5.1.2.2.1 / 1 ).

  • Det sätt på vilket en värd implementering definierar de strängar som det andra argumentet till main() ( 5.1.2.2.1 / 2 ) pekar på .

  • Vad som utgör en "interaktiv enhet" för avsnitten 5.1.2.3 (Utförande av program) och 7.21.3 (Filer) ( 5.1.2.3/7 ).

  • Eventuella begränsningar för objekt som refereras av interrupt-handler-rutiner i en optimeringsimplementering ( 5.1.2.3/10 ).

  • I en fristående implementering, om flera trådar för körning stöds ( 5.1.2.4/1 ).

  • Värdena för medlemmarna i exekveringsteckenuppsättningen ( 5.2.1 / 1 ).

  • char värdena som motsvarar de definierade alfabetiska flykt-sekvenserna ( 5.2.2 / 3 ).

  • De heltal och flytande punkt numeriska gränser och egenskaper ( 5.2.4.2/1 ).

  • Noggrannheten för flytande punkt aritmetiska operationer och av standardbibliotekets omvandlingar från interna flytande punktrepresentationer till strängrepresentationer ( 5.2.4.2.2 / 6 ).

  • Värdet på makro FLT_ROUNDS , som kodar för standardrundningsläget för flytande punkt ( 5.2.4.2.2 / 8 ).

  • Avrundningsbeteenden som kännetecknas av stödda värden på FLT_ROUNDS större än 3 eller mindre än -1 ( 5.2.4.2.2 / 8 ).

  • Värdet på makro FLT_EVAL_METHOD , som karakteriserar FLT_EVAL_METHOD flytande punkt ( 5.2.4.2.2 / 9 ).

  • Beteendet kännetecknas av alla stödda värden på FLT_EVAL_METHOD mindre än -1 ( 5.2.4.2.2 / 9 ).

  • Värdena på makron FLT_HAS_SUBNORM , DBL_HAS_SUBNORM och LDBL_HAS_SUBNORM , som kännetecknar om standardformat för flytande punkt stöder undernormala nummer ( 5.2.4.2.2 / 10 )

typer

  • Resultatet av att försöka (indirekt) få åtkomst till ett objekt med trådlagringsvaraktighet från en annan tråd än den som objektet är associerat med ( 6.2.4 / 4 )

  • Värdet på en char till vilken ett tecken utanför den grundläggande exekveringsuppsättningen har tilldelats ( 6.2.5 / 3 ).

  • De stödda utökade signerade heltalstyperna, om några, ( 6.2.5 / 4 ), och eventuella förlängningsnyckelord som används för att identifiera dem.

  • Oavsett om char har samma representation och beteende som signed char eller som unsigned char ( 6.2.5 / 15 ). Kan ifrågasättas med CHAR_MIN , som är antingen 0 eller SCHAR_MIN om char är inte signerad respektive signerad.

  • Antal, ordning och kodning av byte i representationer av objekt , utom om det uttryckligen anges i standarden ( 6.2.6.1/2 ).

  • Vilken av de tre igenkända formerna för heltalrepresentation gäller i en given situation, och om vissa bitmönster för heltalsobjekt är trap-representationer ( 6.2.6.2/2 ).

  • Justeringskravet för varje typ ( 6.2.8 / 1 ).

  • Huruvida och i vilka sammanhang stöds utvidgade anpassningar ( 6.2.8 / 3 ).

  • Uppsättningen av stödda utökade justeringar ( 6.2.8 / 4 ).

  • Heltalskonverteringsraden för alla utökade signerade heltalstyper relativt varandra ( 6.3.1.1/1 ).

  • Effekten av att tilldela ett värde utanför området till ett signerat heltal ( 6.3.1.3/3 ).

  • När ett inom räckvidd men orepresenterbart värde tilldelas ett flytande punktobjekt, väljs hur det representabla värdet som lagras i objektet väljs mellan de två närmaste representabla värdena ( 6.3.1.4/2 ; 6.3.1.5/1 ; 6.4.4.2 / 3 ).

  • Resultatet av att konvertera ett heltal till en pekartyp , med undantag för heltalskonstantuttryck med värdet 0 ( 6.3.2.3/5 ).

Källformulär

  • #pragma inom #pragma direktiven där rubriknamnetokens känns igen ( 6.4 / 4 ).

  • Tecknen, inklusive multibytta tecken, andra än understruk, oaccenterade latinska bokstäver, universella teckennamn och decimalsiffror som kan visas i identifierare ( 6.4.2.1/1 ).

  • Antalet betydande tecken i en identifierare ( 6.4.2.1/5 ).

  • Med några undantag mappas sättet på vilket källtecken i en heltalsteckenkonstant mappas till exekveringsuppsatta tecken ( 6.4.4.4/2 ; 6.4.4.4/10 ).

  • Det nuvarande landskapet som används för att beräkna värdet på en bred teckenkonstant och de flesta andra aspekter av konverteringen för många sådana konstanter ( 6.4.4.4/11 ).

  • Huruvida olika prefixerade brettsträngslitterära symboler kan sammanlänkas och i så fall behandlingen av den resulterande multibytta teckenföljden ( 6.4.5 / 5 )

  • Landskapsområdet som användes under översättningsfas 7 för att konvertera breda stränglitteraler till multibytes karaktärsekvenser, och deras värde när resultatet inte kan representeras i exekveringsteckenuppsättningen ( 6.4.5 / 6 ).

  • Det sätt på vilket rubriknamn mappas till filnamn ( 6.4.7 / 2 ).

Utvärdering

  • Huruvida och hur flytande FP_CONTRACT kontrakteras när FP_CONTRACT inte används ( 6.5 / 8 ).

  • Värdena på resultaten för sizeof och _Alignof ( 6.5.3.4/5 ).

  • Storleken på resultattypen för pekarsubtraktion ( 6.5.6 / 9 ).

  • Resultatet av att högerförskjuta ett signerat heltal med ett negativt värde ( 6.5.7 / 5 ).

Runtime beteende

  • I vilken utsträckning register är effektivt ( 6.7.1 / 6 ).

  • Oavsett om typen av ett bitfält som deklareras som int är samma typ som unsigned int eller som signed int ( 6.7.2 / 5 ).

  • Vilka typer bitfält kan ta, annat än valfritt kvalificerad _Bool , signed int och unsigned int ; om bitfält kan ha atomtyper ( 6.7.2.1/5 ).

  • Aspekter av hur implementationer lägger ut lagring för bitfält ( 6.7.2.1/11 ).

  • Anpassningen av icke-bitfältmedlemmar i strukturer och fackföreningar ( 6.7.2.1/14 ).

  • Den underliggande typen för varje uppräknad typ ( 6.7.2.2/4 ).

  • Vad som utgör en "åtkomst" till ett objekt av volatile kvalificerad typ ( 6.7.3 / 7 ).

  • Effektiviteten av inline funktionsdeklarationer ( 6.7.4 / 6 ).

Preprocessor

  • Huruvida karaktärskonstanter konverteras till heltalvärden på samma sätt i förbehandlingsbetingelser som i vanliga uttryck, och om en enstaka teckenkonstant kan ha ett negativt värde ( 6.10.1 / 4 ).

  • Platserna sökte efter filer som anges i ett #include include- direktiv ( 6.10.2 / 2-3 ).

  • Det sätt på vilket ett rubriknamn bildas från symbolerna för ett multitoken #include include- direktiv ( 6.10.2 / 4 ).

  • Gränsen för #include inkludera häckning ( 6.10.2 / 6 ).

  • Huruvida ett \ tecken infogas innan \ inför ett universellt teckennamn i resultatet av förarbetarens # -operatör ( 6.10.3.2/2 ).

  • Uppförandet av #pragma förbehandlingsdirektivet för andra STDC än STDC ( 6.10.6 / 1 ).

  • Värdet på __DATE__ och __TIME__ om inget översättningsdatum respektive tid är tillgängligt ( 6.10.8.1/1 ).

  • Den interna teckenkodningen som används för wchar_t om makro __STDC_ISO_10646__ inte är definierad ( 6.10.8.2/1 ).

  • Den interna teckenkodningen som används för char32_t om makro __STDC_UTF_32__ inte är definierad ( 6.10.8.2/1 ).

Standardbibliotek

Allmän

  • Formatet för meddelanden som släpps ut när påståenden misslyckas ( 7.2.1.1/2 ).

Flyttalsmiljöfunktioner

  • Eventuella ytterligare undantag från flytande punkter utöver de som definieras av standarden ( 7.6 / 6 ).

  • Eventuella ytterligare avvecklingslägen för flytande punkter utöver de som definieras av standarden ( 7.6 / 8 ).

  • Eventuella ytterligare flytpunktsmiljöer utöver de som definieras av standarden ( 7.6 / 10 ).

  • Standardvärdet för växlingspunktsmiljöåtkomstomkopplaren ( 7.6.1 / 2 ).

  • Representationen av fegetexceptflag() inspelade av fegetexceptflag() ( 7.6.2.2/1 ).

  • Oavsett om feraiseexcept() -funktionen dessutom höjer det "inexakt" flytande punktundantaget närhelst det höjer "overflow" eller "underflow" flytande punkt undantag ( 7.6.2.3/2 ).

Lokalrelaterade funktioner

  • De andra strängarna än "C" stöds av setlocale() ( 7.11.1.1/3 ).

Matematiska funktioner

  • De typer som representeras av float_t och double_t när FLT_EVAL_METHOD har ett värde som skiljer sig från 0 , 1 och 2 ( 7.12 / 2 ).

  • Alla stödda flyttalsklassificeringar utöver de som definieras av standarden ( 7.12 / 6 ).

  • Värdet som returneras av math.h funktionerna vid ett domänfel ( 7.12.1 / 2 ).

  • Värdet som returneras av math.h funktionerna vid ett polfel ( 7.12.1 / 3 ).

  • Värdet som returneras av math.h fungerar när resultatet underflöden och aspekter av huruvida errno är inställt på ERANGE och om ett flytande ERANGE höjs under dessa omständigheter ( 7.12.1 / 6 ).

  • Standardvärdet för FP-sammandragningsomkopplaren ( 7.12.2 / 2 ).

  • Oavsett om fmod() -funktionerna returnerar 0 eller höjer ett domänfel när deras andra argument är 0 ( 7.12.10.1/3 ).

  • Oavsett om remainder() -funktioner returnerar 0 eller höjer ett domänfel när deras andra argument är 0 ( 7.12.10.2/3 ).

  • Antalet betydande bitar i kvotmodulerna beräknade med remquo() -funktionerna ( 7.12.10.3/2 ).

  • Oavsett om remquo() -funktionerna returnerar 0 eller höjer ett domänfel när deras andra argument är 0 ( 7.12.10.3/3 ).

signaler

  • Den kompletta uppsättningen av signaler som stöds, deras semantik och standardhantering ( 7.14 / 4 ).

  • När en signal lyftes och det finns en anpassad hanterare som är associerad med den signalen, vilka signaler, om några, är blockerade under körningens körning ( 7.14.1.1/3 ).

  • Vilka andra signaler än SIGFPE , SIGILL och SIGSEGV gör att beteendet vid återkomst från en anpassad signalhanterare inte definieras ( 7.14.1.1/3 ).

  • Vilka signaler som initialt är konfigurerade för att ignoreras (oavsett standardhantering; 7.14.1.1/6 ).

Diverse

  • Den specifika nollpekarkonstanten till vilken makro NULL expanderar ( 7.19 / 3 ).

Filhanteringsfunktioner

  • Huruvida den sista raden i en textström kräver en avslutande ny linje ( 7.21.2 / 2 ).

  • Antalet nolltecken bifogades automatiskt till en binär ström ( 7.21.2 / 3 ).

  • Den ursprungliga positionen för en fil öppnas i bilagningsläge ( 7.21.3 / 1 ).

  • Huruvida en skrivning på en textström gör att strömmen trunkeras ( 7.21.3 / 2 ).

  • Stöd för strömbuffring ( 7.21.3 / 3 ).

  • Huruvida filer med noll längd faktiskt finns ( 7.21.3 / 4 ).

  • Reglerna för att komponera giltiga filnamn ( 7.21.3 / 8 ).

  • Huruvida samma fil samtidigt kan vara öppen flera gånger ( 7.21.3 / 8 ).

  • Arten och valet av kodning för multibytta tecken ( 7.21.3 / 10 ).

  • Beteendet för funktionen remove() när målfilen är öppen ( 7.21.4.1/2 ).

  • Beteendet för rename() när målfilen redan finns ( 7.21.4.2/2 ).

  • Huruvida filer som skapats via tmpfile() tas bort om programmet avviker onormalt ( 7.21.4.3/2 ).

  • Vilket läge ändras under vilka omständigheter som är tillåtna via freopen() ( 7.21.5.4/3 ).

I / O-funktioner

  • Vilken av de tillåtna representationerna av oändliga FP-värden som inte är ett antal produceras av printf () - familjefunktionerna ( 7.21.6.1/8 ).

  • Det sätt på vilket pekare formateras av printf() -familjfunktionerna ( 7.21.6.1/8 ).

  • Uppförandet hos scanf() -familjen fungerar när - tecknet visas i en intern position för skannlistan i ett [ fält ( 7.21.6.2/12 ).

  • De flesta aspekterna av scanf() -familjen fungerar att lämna p fält ( 7.21.6.2/12 ).

  • errno värdet inställt av fgetpos() vid fel ( 7.21.9.1/2 ).

  • errno värdet inställt av fsetpos() vid fel ( 7.21.9.3/2 ).

  • errno värdet inställt av ftell() vid fel ( 7.21.9.4/3 ).

  • Betydelsen för strtod() -familjfunktionerna för vissa stödda aspekter av en NaN-formatering ( 7.22.1.3p4 ).

  • Huruvida strtod() -familjfunktionerna ställer in errno till ERANGE när resultatet underströmmar ( 7.22.1.3/10 ).

Funktioner för minnesallokering

  • Uppförandet av minnesallokeringsfunktionerna när antalet byte begärs är 0 ( 7.22.3 / 1 ).

Systemmiljöfunktioner

  • Vilka saneringar, om några, utförs och vilken status returneras till värdens OS när funktionen för abort() kallas ( 7.22.4.1/2 ).

  • Vilken status returneras till värdmiljön när exit() kallas ( 7.22.4.4/5 ).

  • Hanteringen av öppna strömmar och vilken status som returneras till _Exit() när _Exit() kallas ( 7.22.4.5/2 ).

  • Uppsättningen av getenv() tillgängliga via getenv() och metoden för att förändra miljön ( 7.22.4.6/2 ).

  • Returvärdet för system() ( 7.22.4.8/3 ).

Datum- och tidsfunktioner

  • Den lokala tidszonen och sommartid ( 7.27.1 / 1 ).

  • clock_t intervall och precision som kan representeras via typerna clock_t och time_t ( 7.27.1 / 4 ).

  • Början av eran som fungerar som referens för de tider som returneras av clock() ( 7.27.2.1/3 ).

  • Början av epok som fungerar som referens för de tider som returneras av timespec_get() (när TIME_UTC är TIME_UTC ; 7.27.2.5/3 ).

  • strftime() för %Z konverteringsspecifikationen i "C" -området ( 7.27.3.5/7 ).

I / O-funktioner med bred karaktär

  • Vilken av de tillåtna representationerna av oändliga FP-värden som inte är ett antal produceras av wprintf() -familjfunktionerna ( 7.29.2.1/8 ).

  • Det sätt på vilket pekare formateras av wprintf() -familjen ( 7.29.2.1/8 ).

  • wscanf() hos wscanf() -familjen fungerar när - tecknet visas i en intern position för skannlistan för ett [ fält ( 7.29.2.2/12 ).

  • De flesta aspekterna av wscanf() -familjfunktionernas överlämnande av p fält ( 7.29.2.2/12 ).

  • Betydelsen för wstrtod() -familjfunktioner för vissa stöttade aspekter av NaN-formatering ( 7.29.4.1.1 / 4 ).

  • Huruvida wstrtod() -familjfunktionerna ställer in errno till ERANGE när resultatet undervannar ( 7.29.4.1.1 / 10 ).

Höger skift av ett negativt heltal

int signed_integer = -1;

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

Tilldela ett värde utanför området till ett heltal

// 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;

Tilldela nollbyte

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

Representation av signerade heltal

Varje signerad heltalstyp kan representeras i vilket som helst av tre format; det är implementeringsdefinerat vilken som används. Implementeringen som används för varje given signerad heltalstyp som är minst lika bred som int kan bestämmas vid körning från de två bitarna med lägsta ordning för representationen av värdet -1 i den typen, så:

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"); }
}

Samma mönster gäller för representation av smalare typer, men de kan inte testas med denna teknik eftersom operandema för & är föremål för "de vanliga aritmetiska omvandlingarna" innan resultatet beräknas.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow