windows - Visual C ++ Standard Library-søgeord

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg ønskede at skrive en unicode-version af std :: undtagelse og std :: runtime\_error.

Så jeg troede, hvilken bedre måde at bare tage implementeringer fra C ++ Standard Library og ændre dem til at understøtte Unicode.


Så jeg hentede undtagelse og stdexcept overskrifter i Visual C ++, kopierede koden, lavede mine ændringer.


Sagen er, at jeg ikke kunne få linket, medmindre jeg fjernede \_CRTIMP\_PURE.
Jeg fjernede også \_EXCEPTION\_INLINE \_\_CLR\_OR\_THIS\_CALL prefikset fra alle medlemsfunktionerne.


Det virker, men jeg er meget nysgerrig, hvad alle disse ting gjorde.

\_EXCEPTION\_INLINE er det bogstaveligt defineret lige over det som #define \_EXCEPTION\_INLINE, og mine googling færdigheder kan ikke finde nogen dokumentation om, hvad de gør.


Så ved nogen, hvad det er meningen at gøre? Og hvorfor sår det ikke, før jeg fjernede \_CRTIMP\_PURE præfiks fra klassen?

Bedste reference


Disse er ikke noget noget mystisk (men det kan være lidt pf en smerte at spore, hvor de er defineret - men kun lidt). De er defineret i overskrifter, der er en del af biblioteket, og de påtager sig forskellige definitioner, afhængigt af hvordan kompilatoren er konfigureret til den aktuelle runde. Disse macer ser især ud til at være bekymret for, om det nuværende løb er konfigureret eller ej for /clr:pure.


\_CRTIMP\_PURE er defineret til \_\_declspec(dllimport), hvis du forbinder DLL-versionen af ​​C runtime (og ikke bygger med /clr:pure) og defineret til intet andet.


Hvis dit bibliotek ikke er 'ta DLL' (eller hvis det vundet 'nødvendigvis er en DLL, når DLL-runtime er konfigureret), så skal du ikke bruge det. Du skal nok ikke bruge det alligevel, fordi du skal definere Det er anderledes, når bygger dit bibliotek, end når dit bibliotek bliver brugt (det er det, Microsoft gør, når de bygger C-runtime-biblioteker).


\_\_CLR\_OR\_THIS\_CALL bruges af Microsofts biblioteker til at erklære en funktion med \_\_clrcall, hvis du bygger med /clr:pure (hvilket angiver, at disse funktioner kun vil blive kaldt af administreret kode - kompilatoren kan udføre visse optimeringer i så fald synes det).


Endelig er \_EXCEPTION\_INLINE brugt til at gøre medlemsfunktionerne i class exception inline ved bygning med /clr:pure.


Så bundlinjen er ikke at bruge \_\_CLR\_OR\_THIS\_CALL eller \_EXCEPTION\_INLINE, medmindre du planlægger at understøtte /clr til dit bibliotek, og du skal sandsynligvis ikke bruge \_CRTIMP\_PURE i din implementering , men sandsynligvis bør bruge noget, der ligner din egen fremstilling og under din egen kontrol.

Andre referencer 1


Standardbibliotekets implementeringskode bruger ofte kompilatorspecifikke udvidelser til ydeevne/dokumentation/pålidelighed. Du bør ikke bruge disse udvidelser i din egen kode, fordi de kan bryde i efterfølgende versioner af kompilatoren.


Der er ikke noget problem med at duplikere interface af std::exception og venner, og du kan se på Visual Studios implementering til inspiration. Men din implementering bør kun bruge offentligt dokumenterede sprog/bibliotek funktioner.