C ++ in modo succinto Visual Studio e C ++

IntelliSense

Se stai utilizzando quasi tutti i mapping della tastiera di Visual Studio, digitando Ctrl + J verrà visualizzato IntelliSense. In Visual Studio 2012, IntelliSense dovrebbe apparire automaticamente in C ++. In Visual Studio 2010 e versioni precedenti, è necessario richiamarlo manualmente.


Frammenti di codice

Gli snippet di codice sono una nuova funzionalità di C ++ in Visual Studio 2012. Non esistevano nelle versioni precedenti. Se non li hai mai usati in nessuna lingua, quindi in un progetto C #, inizia a digitare "for" per iniziare un ciclo for; una volta che IntelliSense ha scelto il frammento per, premere due volte il tasto Tab e guardare come appare il ciclo for completo di campi automatici che è possibile modificare. Usa il tasto Tab per passare da un campo all'altro. Quando hai finito di modificare i campi, premi Invio. Il cursore verrà trasportato all'interno del corpo del loop con le modifiche apportate al campo che vengono visualizzate come testo normale.

I frammenti di codice sono particolarmente utili per le istruzioni switch che attivano un enumerazione, poiché popoleranno automaticamente l'istruzione switch con tutti i membri di enum.


Comprese le biblioteche

In C ++, di solito non è sufficiente includere solo un file di intestazione. Normalmente è necessario indicare al linker di collegarsi a una libreria che implementa il codice dichiarato nel file di intestazione. Per fare ciò, è necessario modificare le proprietà del progetto, accessibili nel menu Progetto come Proprietà NomeProgetto ...

Nelle proprietà, in Proprietà di configurazione> Linker> Input, uno dei campi è Dipendenze aggiuntive. Questo è un elenco separato da punto e virgola dei file .LIB a cui è necessario collegarsi. Dovrebbe terminare con% (AdditionalDependencies) in modo che vengano aggiunte eventuali librerie aggiuntive collegate tramite MS Build.

Ad esempio, per un tipico gioco in stile Metro DirectX 11, potresti vedere quanto segue:

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)

Se ricevi un errore del linker che ti dice che non è possibile trovare una definizione di qualcosa che stai usando, trova la funzione o la classe su MSDN; la documentazione ti dirà sia il file di intestazione che il file di libreria che ti serve.

Generazione di file di codice assembly

Se si desidera visualizzare un'approssimazione molto ravvicinata del codice assembly in cui viene compilato il codice, nelle proprietà del progetto, in Proprietà di configurazione> C / C ++> File di output, impostare l'opzione Assembler Output su un valore diverso da Nessun elenco.

Consiglierei l'elenco solo per assembly (/ FA) o l'assembly con codice sorgente (/ FA). L'elenco con solo assembly assorbe abbastanza commenti al numero di riga che è possibile in genere fare un riferimento incrociato con i file del codice sorgente per vedere quale codice C ++ corrisponde al codice assembly. Questo può essere utile se vuoi che un luogo veda tutto invece di sfogliare avanti e indietro tra qualsiasi cosa tu abbia aperto il file .ASM in (io uso Notepad ++) e Visual Studio.

Si noti che l'assembly generato utilizza le macro MASM (trovarle su MSDN). Se non si conosce il significato di una particolare istruzione di assemblaggio (ad es. LEA), è possibile cercare su Internet o scaricare il manuale di programmazione appropriato dal sito Intel (presupponendo x86 / Itanium), il sito AMD (ipotizzando x64) o ARM Holding sito (presupponendo ARM). Se non hai mai imparato alcun assemblaggio, ti consiglio vivamente di farlo (prova a creare una semplice app per console di Windows).

Comprendere l'assembly ti dà una migliore comprensione di come i computer funzionano davvero internamente. Combinalo con la consapevolezza che i computer sono tutti cablati per iniziare a eseguire lo stesso codice ogni volta che vengono accesi (tradizionalmente il BIOS su PC, anche se ora viene sostituito da UEFI), e il mistero di come e perché i computer funzionano rapidamente svanire.


Errori di costruzione terrificanti

Se ti imbatti in un errore di compilazione che sembra completamente orribile, è probabile che provenga dal linker. Vedrai messaggi come questo, ad esempio:

Errore 2 errore LNK2019: simbolo esterno non risolto "public: __thiscall SomeClass :: SomeClass (wchar_t const *)" (?? 0SomeClass @@ QAE @ PB_W @ Z) a cui si fa riferimento nella funzione "void __cdecl DoSomething (void)" (? DoSomething @@ YAXXZ) D: \ VS2010Proj \ CppSandbox \ CppSandbox \ CppSandbox.obj CppSandbox

Tutto ciò che sta dicendo è che non riesce a trovare una funzione che hai detto dovrebbe essere in grado di trovare. In questo caso, ho aggiunto la parola chiave inline a una definizione della funzione di costruzione nel file CPP senza ricordare di riposizionare quella definizione nel file di intestazione. Tutte le funzioni inline devono essere nell'intestazione in modo che il linker non ti odierà.

Tutti questi ?? s e @@ ands sono esattamente come C ++ manipola i nomi quando ha compilato il codice nei file oggetto. La manomissione dei nomi è internamente coerente per il compilatore in questione, ma lo standard ISO / IEC non impone alcun particolare schema per il manomissione dei nomi. Diversi compilatori possono, e spesso lo faranno, manipolare le cose in modo diverso.

Normalmente, se vedi un orribile messaggio di errore di build, è probabile che provenga dal linker, ed è un errore di simbolo non risolto. Se dice che non riesce a trovare qualcosa che hai scritto, controlla che la dichiarazione nel file di intestazione corrisponda alla definizione, di solito nel file di codice ma magari nell'intestazione, o forse hai dimenticato di scriverlo, o forse hai dichiarato è in linea ma ce l'ha ancora nel file di codice.

Un esempio di questo è nel caso precedente: il mio SomeClass :: SomeClass (wchar_t const *) funzione di costruzione (scrivo sempre const type non type const, quindi anche quel bit è ricostruito).

Se si tratta della funzione di qualcun altro o di un altro simbolo, è probabile che non abbiate detto al linker il file .LIB che lo contiene.

In .NET, basta aggiungere un riferimento a un assieme per ottenere sia i bit di dichiarazione sia la definizione effettiva in un unico strumento. In C ++, la dichiarazione è il file di intestazione, mentre il codice di definizione, escludendo il codice inline, che deve essere presente anche nel file di intestazione, si trova in una libreria separata. Cerca nella libreria MSDN il simbolo mancante e trova il nome del file della libreria che devi aggiungere.

Gli errori di compilazione di C ++ possono sembrare piuttosto spaventosi, soprattutto quando si riceve un errore di compilazione che coinvolge un modello. Quelli possono farti venire voglia di smettere. Ma non farlo. Non permettere mai agli orribili messaggi di errore di vincere. In primo luogo, capire se proviene dal compilatore (avrà un formato numero errore C ####) o il linker (formato numero errore LNK ####).

Se dal compilatore, di solito significa un errore di sintassi. Controlla le cose come se hai dimenticato la #pragma una volta nella parte superiore del file di intestazione. Un altro problema potrebbe essere quello in cui hai usato qualcosa dalla Libreria standard (ad es., endl) ma ha dimenticato di avere un #using namespace std; o per il prefisso con std :: (es. std :: endl).

Puoi fare entrambi o entrambi, ma devi fare almeno uno. Alcune cose potrebbero essere in uno spazio dei nomi diverso. In Visual Studio 2010, alcune funzionalità si trovano nello spazio dei nomi stdext, ad esempio. Lo stesso vale per qualsiasi spazio dei nomi nel tuo codice.

Se non hai fortuna da solo, vai su MSDN e digita la prima parte del messaggio di errore. Probabilmente troverai alcuni link utili alle discussioni sui forum MSDN, su StackOverflow, forse un articolo su MSDN o un post sul blog MSDN; forse anche la stessa pagina del codice di errore avrà il suggerimento necessario. Se tutto il resto fallisce, pubblica una domanda sul sito di un forum: MSDN, il sito StackExchange appropriato o l'App Hub.

Un errore del linker è in genere un simbolo non risolto, che in genere indica una mancata corrispondenza nella dichiarazione e nella definizione, un inline all'esterno della relativa intestazione o la libreria corretta non aggiunta alle dipendenze extra del progetto nelle opzioni del linker del progetto. Se è qualcos'altro, prova le strategie del paragrafo precedente; si applicano altrettanto bene agli errori del linker come agli errori del compilatore.

Conclusione

Se stai facendo molto sviluppo in C ++, allora Visual Studio è sicuramente un IDE (Integrated Development Environment) che vale la pena considerare. Ha molto altro da offrire rispetto a quello trattato in questo articolo, quindi ti consiglio di provarlo ed esplorare la sua vasta gamma di funzionalità.

Questa lezione rappresenta un capitolo di C ++, un eBook gratuito del team di Syncfusion.