C ++ Succinctly Visual Studio og C ++

IntelliSense

Hvis du bruker nesten noen av Visual Studio-tastaturmappings, vil Ctrl + J ta opp IntelliSense. I Visual Studio 2012 skal IntelliSense vises automatisk i C ++. I Visual Studio 2010 og tidligere må du påkalle det manuelt.


Kodeutdrag

Kodestykker er en ny funksjon for C ++ i Visual Studio 2012. De eksisterte ikke i tidligere versjoner. Hvis du aldri har brukt dem på noe språk, så i et C # -prosjekt, begynner du å skrive "for" for å starte en for-løkke; Når IntelliSense har valgt forutdraget, trykker du to ganger på Tab-tasten og ser som for for-loop vises komplett med automatiske felt du kan redigere. Bruk Tab-tasten for å bytte mellom felt. Når du er ferdig med å redigere feltene, trykker du på Enter. Markøren vil bli transportert i sløyfelegemet med de feltredigeringene du har laget, vises som vanlig tekst.

Kodestykker er spesielt hyggelige for bryterklæringer som slår på en enum, siden de automatisk vil fylle bryteroppstillingen med alle medlemmene.


Inkludert biblioteker

I C ++ er det vanligvis ikke nok til bare å inkludere en headerfil. Normalt må du fortelle linkeren å koble til et bibliotek som implementerer koden deklarert i headerfilen. For å gjøre dette må du redigere prosjektets egenskaper, tilgjengelig i Prosjekt-menyen som ProjectName Properties ...

I egenskapene, under Konfigurasjonsegenskaper> Linker> Input, er ett av feltene Ytterligere avhengigheter. Dette er en semikolonskilt liste over .LIB-filene du må koble til. Den skal ende med% (AdditionalDependencies) slik at eventuelle tilleggsbibliotek koblet via MS Build vil bli lagt til.

For et typisk DirectX 11 Metro-spill kan du for eksempel se følgende:

d2d1.lib; d3d11.lib; dxgi.lib; ole32.lib; windowscodecs.lib; dwrite.lib; xaudio2.lib; xinput.lib; mfcore.lib; mfplat.lib; mfreadwrite.lib; mfuuid.lib; % (AdditionalDependencies)

Hvis du får en linkerfeil som forteller deg at den ikke kan finne en definisjon av noe du bruker, finn funksjonen eller klassen på MSDN; dokumentasjonen vil fortelle deg både overskriftsfilen og bibliotekfilen du trenger.

Generere Assembly Code Files

Hvis du vil se en svært nær tilnærming til forsamlingskoden som koden din er sammensatt til, i prosjektets egenskaper, under Konfigurasjonsegenskaper> C / C ++> Output Files, må du sette alternativet Assembler Output til noe annet enn No Listing.

Jeg anbefaler enten Assembly-Only Listing (/ FA) eller Assembly med Source Code (/ FAs). Assembly-Only Listing sprinkler nok line-nummer kommentarer som du vanligvis kan krysreferanse med kildekodefiler for å se hvilken C + + -kode som tilsvarer forsamlingskoden. Det kan være nyttig hvis du vil ha et sted å se alt i stedet for å bla frem og tilbake mellom hva du har åpnet. ASM-filen i (jeg bruker Notepad ++) og Visual Studio.

Merk at den genererte enheten bruker MASM-makroer (finn dem på MSDN). Hvis du ikke vet hva en bestemt monteringsinstruksjon betyr (f.eks. LEA), kan du søke på Internett for det eller laste ned riktig programmeringshåndbok fra Intels nettsted (forutsatt x86 / Itanium), AMDs nettsted (forutsatt x64) eller ARM Holding s nettsted (antar ARM). Hvis du aldri har lært noen montering, anbefaler jeg absolutt å gjøre det (prøv å lage en enkel Windows Console-app).

Forståelse av montering gir deg en bedre forståelse av hvordan datamaskiner virkelig fungerer internt. Kombiner det med kunnskap om at datamaskiner er alle hardwired for å begynne å utføre samme kode hver gang de er slått på (tradisjonelt BIOS på PCer, selv om det nå blir erstattet av UEFI), og mysteriet om hvordan og hvorfor datamaskiner fungerer raskt, begynner å blekne.


Skremmende bygge feil

Hvis du kommer over en byggefeil som ser helt fryktelig ut, er sjansene for at den er fra linkeren. Du vil se slike meldinger, for eksempel:

Feil 2 feil LNK2019: uløst eksternt symbol "offentlig: __thiscall SomeClass :: SomeClass (wchar_t const *)" (0SomeClass @@ QAE @ PB_W @ Z) referert i funksjon "ugyldig __cdecl DoSomething (void)" (?)

Alt som sier er det ikke kan finne en funksjon du sa det burde kunne finne. I dette tilfellet la jeg inline-søkeordet til en konstruktørfunksjonsdefinisjon i CPP-filen uten å huske å flytte denne definisjonen til headerfilen. Eventuelle inline funksjoner må være i toppteksten, slik at linkeren ikke hater deg.

Alle de 锟 斤 拷 s og @@ ands er akkurat hvordan C ++ mangler navn når den har samlet kode i objektfiler. Navngivning er internt konsistent for kompilatoren i spørsmålet, men ISO / IEC-standarden gir ikke noen spesifikke skjemaer for navngivning av navn. Ulike kompilatorer kan, og ofte vil, mangle ting annerledes.

Normalt, hvis du ser en forferdelig byggefeilmelding, er sjansene for at det er fra linkeren, og det er en uløst symbolfeil. Hvis det er sagt at det ikke kan finne noe du skrev, så kontroller du at erklæringen i headerfilen samsvarer med definisjonen, vanligvis i kodefilen, men kanskje i overskriften, eller kanskje du har glemt å skrive den, eller kanskje du erklærte deg det inline men har det fortsatt i kodefilen.

Et eksempel på dette er i det forrige tilfellet: min SomeClass :: SomeClass (wchar_t const *) constructor funksjon (jeg skriver alltid const type ikke type const, så selv den biten er rekonstruert).

Hvis det er andres funksjon eller et annet symbol, så er det sjansene for at du ikke fortalte linkeren om .LIB-filen som inneholder den.

I. NET legger du bare til en referanse til en forsamling for å få både deklarasjonsbitene og den faktiske definisjonen alt i ett. I C ++ er erklæringen headerfilen, mens definisjonskoden, utenom inline-koden, som også må være i headerfilen, er i et eget bibliotek. Søk i MSDN-biblioteket for det manglende symbolet og finn navnet på bibliotekfilen du må legge til.

C ++-byggefeil kan se ganske skummelt ut, spesielt når du mottar en byggfeil som involverer en mal. De kan få deg til å slutte. Men ikke. La aldri de forferdelige feilmeldingene vinne. Først finner du ut om det kommer fra kompilatoren (det vil ha et C #### feilnummerformat) eller linker (LNK #### feilnummerformat).

Hvis fra kompilatoren, betyr det vanligvis en syntaksfeil. Kontroller ting som om du har glemt #pragma en gang øverst på headerfilen din. Et annet problem kan være hvor du brukte noe fra Standard Library (f.eks., endl) men glemte å ha en #using navneplass std; eller å prefikse det med std :: (dvs.. std :: endl).

Du kan gjøre begge deler, men du må gjøre minst én. Noen ting kan være i et annet navneområde. I Visual Studio 2010 er noen funksjoner i stdext namespace, for eksempel. Det samme gjelder for navneområder i din egen kode.

Hvis du ikke har lykke på egenhånd, gå til MSDN og skriv inn den første delen av feilmeldingen. Du finner sannsynligvis noen nyttige koblinger til diskusjoner på MSDN-fora, på StackOverflow, kanskje en MSDN-artikkel eller et MSDN-blogginnlegg. Det kan også hende at feilkildens side selv har det hintet du trenger. Hvis alt annet feiler, legg inn et spørsmål på et forums nettsted: MSDN, det aktuelle StackExchange-nettstedet eller App Hub.

En linkerfeil er vanligvis et uoppløst symbol, som vanligvis betyr at du har en feilmatch i deklarasjon og definisjon, har en inline utenfor hovedteksten, eller har ikke det riktige biblioteket lagt til prosjektets ekstra avhengigheter i prosjektets linkeralternativer. Hvis det er noe annet, prøv strategiene fra forrige avsnitt; de gjelder like bra for linkerfeil som kompilatorfeil.

Konklusjon

Hvis du gjør mye C ++-utvikling, er Visual Studio sikkert et IDE (Integrated Development Environment) verdt å vurdere. Den har mye mer å tilby enn det som er dekket i denne artikkelen, så jeg oppfordrer deg til å prøve det og utforske det brede spekteret av funksjoner.

Denne leksjonen representerer et kapittel fra C ++ Succinctly, en gratis eBok fra teamet på Syncfusion.