Type kvalifikationer

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 6. februar 2018; checks kræver 3 redigeringer .

Typekvalifikationen er et af de reserverede ord  eller på programmeringssprogene i C - familien . constvolatilerestrict

Syntaks

Typekvalifikationer bruges i flere syntaktiske sammenhænge:

const int * p ; /* const gælder for typen af ​​det spidse objekt */
  • når du definerer en pointer : gælder for den tilsvarende pointertype. For eksempel:
int * begrænse p ; /* restriktion gælder for pointertype p */ klasse C { offentligt : int f () const ; /* const-kvalificeret medlemsfunktion */ };

Semantik

Typekvalifikationer anvendes på typerne af l-udtryk (i C og C++) og r-udtryk af klassetyper (i C++), hvilket påvirker adgangssemantikken for de objekter , der henvises til af disse udtryk:

  • const-kvalificeret type af et l-udtryk, såvel som konstkvalificerede felter af strukturer og fagforeninger i C og datamedlemmer af klassetyper i C++, der er typer af l-udtryk, indikerer, at et sådant l-udtryk ikke er et modificerbart l- udtryk , og dermed kan objektet, det refererer til, ikke modificeres gennem det l-udtryk ved inkrementering , decrement , tildelingsoperationer eller ved påkaldelse af en constu-kvalificeret medlemsfunktion. For eksempel:
void f ( const int * p ) { * p = 0 ; /* FEJL: *p er et ikke-modificerbart l-udtryk af typen const int */ }
  • kvalificering ( CV-kvalifikation ) af medlemsfunktioner i C++ betyder, at venstre side af medlemsfunktionsadgangsoperationen i medlemsfunktionsopkaldsoperationen skal have (ved adgang ved brug af operationen .) eller pege på (ved adgang vha. operationen ->) en objekttype, der ikke er mere kvalificeret end . For eksempel:
klasse C { offentligt : C (); int f () const ; intg ( ); }; ugyldig f () { const C c ; c . f (); /* OK: kvalifikationerne for c og C::f() matcher */ c . g (); /* FEJL: kvalifikation c er ikke nok til at kalde C::g() */ }
  • restrict-kvalifikationen af ​​pointere i C99 betyder, at pointere peger på data, der ikke overlapper i hukommelsen (se overlappende objekter ). Disse oplysninger giver compileren mulighed for sikkert at anvende visse specielle typer optimeringer. For eksempel er standardfunktionsprototyperne memcpyog memmovedefineret i C99 forskellige:
#include <string.h> void * memcpy ( void * limit s1 , /* kopierede områder må ikke overlappe */ const void * limit s2 , size_t n ); void * memmove ( void * s1 , /* kopierede områder kan overlappe */ const void * s2 , size_t n );
  • nøgleordet volatileangiver, at den variabel, der er erklæret på denne måde, kan ændre sig uanset programmets handlinger. Pointen med at bruge en qualifier er, at compilere kan optimere kode, der bruger en variabel uden at tage højde for muligheden for at ændre den på grund af eksterne forhold.

Se også