C ++ Kort gezegd Visual Studio en C ++

IntelliSense

Als u bijna alle Visual Studio-toetsenbordtoewijzingen gebruikt, wordt de IntelliSense weergegeven door te typen op Ctrl + J. In Visual Studio 2012 zou IntelliSense automatisch moeten verschijnen in C ++. In Visual Studio 2010 en eerder moet u dit handmatig aanroepen.


Codefragmenten

Codefragmenten zijn een nieuwe functie voor C ++ in Visual Studio 2012. Ze bestonden niet in eerdere versies. Als u ze nog nooit in een andere taal hebt gebruikt, begint u in een C # -project met "for" om een ​​for-lus te beginnen; Zodra IntelliSense het voorfragment heeft gekozen, drukt u tweemaal op de Tab-toets en kijkt u hoe een for-lus wordt weergegeven, compleet met automatische velden die u kunt bewerken. Gebruik de Tab-toets om tussen velden te schakelen. Als je klaar bent met het bewerken van de velden, druk je op Enter. De cursor wordt binnen het lichaam van de lus getransporteerd met de veldbewerkingen die u hebt gemaakt als normale tekst.

Codefragmenten zijn met name handig voor switchinstructies die een enum inschakelen, omdat ze automatisch de switch-opdracht invullen met alle leden van de enum.


Inclusief bibliotheken

In C ++ is het meestal niet voldoende om alleen een headerbestand op te nemen. Normaal gesproken moet u de linker opdracht geven om een ​​koppeling te maken met een bibliotheek die de code implementeert die in het headerbestand is gedeclareerd. Om dit te doen, moet u de eigenschappen van het project bewerken, die toegankelijk zijn in het projectmenu als ProjectName-eigenschappen ...

In de eigenschappen, onder Configuratie-eigenschappen> Linker> Invoer, is een van de velden Extra afhankelijkheden. Dit is een door puntkomma gescheiden lijst van de .LIB-bestanden waarmee u een koppeling moet maken. Het moet eindigen met% (AdditionalDependencies), zodat eventuele extra bibliotheken gekoppeld via MS Build worden toegevoegd.

Voor een typisch DirectX 11 Metro-achtig spel ziet u bijvoorbeeld het volgende:

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)

Als u een linkerfout ontvangt die aangeeft dat een definitie van iets dat u gebruikt, niet kan worden gevonden, zoekt u de functie of klasse op MSDN; de documentatie zal u zowel het header-bestand als het bibliotheekbestand vertellen dat u nodig hebt.

Assemblagecodebestanden genereren

Als u een zeer korte benadering wilt bekijken van de assembly-code waarin uw code is gecompileerd, stelt u in de eigenschappen van uw project onder Configuratie-eigenschappen> C / C ++> Output Files de optie Assembler Output in op iets anders dan Geen vermelding.

Ik zou zowel Assembly-Only Listing (/ FA) of Assembly met broncode (/ FA's) aanbevelen. Assembly-Only Listing strooit genoeg regelnummeropmerkingen die u meestal kunt doorverwijzen naar uw broncodebestanden om te zien welke C ++ -code overeenkomt met de assemblagecode. Dat kan handig zijn als je wilt dat één plek alles ziet in plaats van heen en weer te bladeren tussen wat je ook hebt geopend in het .ASM-bestand in (ik gebruik Notepad ++) en Visual Studio.

Merk op dat de gegenereerde assembly MASM-macro's gebruikt (vind ze op MSDN). Als u niet weet wat een bepaalde montage-instructie betekent (bijv. LEA), kunt u op internet zoeken of de juiste programmeerhandleiding downloaden van de site van Intel (uitgaande van x86 / Itanium), de AMD-site (uitgaande van x64) of ARM Holding's site (uitgaande van ARM). Als je nog nooit een assembly hebt geleerd, raad ik je zeker aan dit te doen (probeer een eenvoudige Windows Console-app te maken).

Als u de assembly begrijpt, krijgt u meer inzicht in hoe computers intern echt werken. Combineer dat met de wetenschap dat computers allemaal bedraad zijn om elke keer dat ze worden ingeschakeld dezelfde code uit te voeren (traditioneel het BIOS op pc's, hoewel dat nu wordt vervangen door UEFI) en het mysterie van hoe en waarom computers snel werken begint vervagen.


Angstaanjagende bouwfouten

Als je een build-fout tegenkomt die er helemaal afschuwelijk uitziet, is de kans groot dat hij van de linker komt. Je ziet berichten zoals deze, bijvoorbeeld:

Fout 2 fout LNK2019: niet opgelost extern symbool "publiek: __thiscall SomeClass :: SomeClass (wchar_t const *)" (?? 0SomeClass @@ QAE @ PB_W @ Z) waarnaar wordt verwezen in functie "void __cdecl DoSomething (void)" (? DoSomething @@ YAXXZ) D: \ VS2010Proj \ CppSandbox \ CppSandbox \ CppSandbox.obj CppSandbox

Het enige dat zegt is dat het geen functie kan vinden die je zei dat het zou moeten kunnen vinden. In dit geval heb ik het sleutelwoord inline toegevoegd aan een constructorfunctiedefinitie in het CPP-bestand zonder te onthouden om die definitie naar het headerbestand te verplaatsen. Alle inline-functies moeten in de header staan ​​zodat de linker je niet haat.

All that ?? s en @@ ands zijn precies hoe C ++ mangelt namen wanneer het code heeft gecompileerd in objectbestanden. Naammangelen is intern consistent voor de betreffende compiler, maar de ISO / IEC-standaard geeft geen specifiek schema voor naamverwarring. Verschillende compilers kunnen, en vaak zullen, dingen anders verwarren.

Normaal gesproken, als je een gruwelijke build-foutmelding ziet, is de kans groot dat het van de linker komt en het is een onopgeloste symboolfout. Als het zegt dat het iets niet kan vinden dat je hebt geschreven, controleer dan of je verklaring in het headerbestand overeenkomt met de definitie, meestal in het codebestand maar misschien in de kop, of misschien ben je vergeten het te schrijven, of misschien verklaarde je het inline maar heeft het nog steeds in het codebestand.

Een voorbeeld hiervan is in het vorige geval: mijn SomeClass :: SomeClass (wchar_t const *) constructorfunctie (ik schrijf altijd const-type, typ geen const, dus zelfs dat bit wordt gereconstrueerd).

Als het de functie of een ander symbool van een ander is, is de kans groot dat je de linker niet hebt verteld over het .LIB-bestand waarin het is opgenomen.

In .NET voegt u gewoon een verwijzing naar een assembly toe om zowel de declaratiebits als de werkelijke definitie allemaal in één te krijgen. In C ++ is de declaratie het header-bestand, terwijl de definitiecode-exclusief inline-code, die ook in het header-bestand moet staan, zich in een aparte bibliotheek bevindt. Zoek in de MSDN-bibliotheek naar het ontbrekende symbool en zoek de naam van het bibliotheekbestand dat u moet toevoegen.

C ++ build-fouten kunnen behoorlijk eng lijken, vooral als je een build-fout met een sjabloon ontvangt. Die kunnen ervoor zorgen dat je wilt stoppen. Maar doe het niet. Laat nooit de vreselijke foutmeldingen winnen. Zoek eerst uit of het van de compiler komt (het heeft een C #### foutnummer formaat) of de linker (LNK #### error number format).

Als dit van de compiler komt, betekent dit meestal een syntaxisfout. Controleer dingen als of u het #pragma één keer bent vergeten bovenaan in uw headerbestand. Een ander probleem zou kunnen zijn wanneer u iets uit de standaardbibliotheek (bijv., endl) maar vergat een #gebruikende naamruimte standaard; of om het te prefixen met std :: (d.w.z.. std :: endl).

Je kunt een van beide of beide doen, maar je moet er minstens één doen. Sommige dingen bevinden zich mogelijk in een andere naamruimte. In Visual Studio 2010 bevindt enige functionaliteit zich bijvoorbeeld in de stdext-naamruimte. Hetzelfde geldt voor alle naamruimten in uw eigen code.

Als u zelf geen geluk hebt, gaat u naar MSDN en typt u het eerste deel van het foutbericht. Waarschijnlijk vind je een aantal nuttige links naar discussies op de MSDN-forums, op StackOverflow, misschien een MSDN-artikel of een MSDN-blogpost, misschien heeft zelfs de pagina van de foutcode zelf de hint die je nodig hebt. Als niets anders lukt, plaatst u een vraag op een forumsite: MSDN, de juiste StackExchange-site of App Hub.

Een linkerfout is meestal een niet-opgelost symbool, wat meestal betekent dat u een verkeerde combinatie hebt van declaratie en definitie, een inline buiten de header hebt of niet de juiste bibliotheek hebt toegevoegd aan de extra afhankelijkheden van het project in de linkeropties van het project. Als het iets anders is, probeer dan de strategieën uit de vorige paragraaf; ze zijn net zo goed van toepassing op linkerfouten als op compilerfouten.

Conclusie

Als je veel C ++ ontwikkelt, dan is Visual Studio zeker een IDE (Integrated Development Environment) die het overwegen waard is. Het heeft veel meer te bieden dan wat in dit artikel wordt behandeld, dus ik moedig je aan om het eens te proberen en zijn brede scala aan functies te ontdekken.

Deze les staat voor een hoofdstuk uit C ++ Kort gezegd, een gratis eBoek van het team van Syncfusion.