2011-02-08 14 views
7

Sono nuovo alla codifica C++, proveniente da Java e C#. Sono perplesso dalla proliferazione di termini #define a partire dal più semplice:Perché esiste una macro che definisce _tmain?

#define _tmain wmain 

Quando ho imparato un'infarinatura di C secoli fa, la funzione principale era:

int main(int argc, char *argv[]) 

In Visual C++ progetto che ho creato, ha fatto la funzione principale:

int _tmain(int argc, _TCHAR* argv[]) 

sto solo chiedendo perché ci doveva essere una traduzione nome da wmain a _tmain? Perché non utilizzare solo il prototipo di funzione C main originale?

In generale sembra che ci sia molta #define rinominando qualcosa che sembra piuttosto chiaro per cominciare, a qualcosa che sembra più misterioso e meno chiaro (mi riferisco a wmain_tmain ??).

Grazie per aver tollerato quella che potrebbe essere una domanda molto ovvia.

+7

Questo è roba specifico di Windows, non ha nulla a che fare con Standard C++ (né C). Loro (in Microsoft) hanno una brutta abitudine di orribili schemi di denominazione e complicano le cose inutilmente. –

+2

C'era una volta, qualcuno pensava che fosse una buona idea aiutare le persone a migrare da vecchie versioni di Windows usando char a newer una volta usando wchar_t. Non lo era, e ora confonde le persone! –

+1

Correlati: http://stackoverflow.com/questions/234365/is-tchar-still-relevant – dan04

risposta

13

Questa è una funzionalità specifica di Visual C++, non è una parte di C++.

La maggior parte delle funzioni API di Windows hanno due versioni: quelli che terminano in W, che sono per l'uso con le stringhe larghe di caratteri (wchar_t stringhe) e quelli che terminano in A, che sono per l'uso con le stringhe di caratteri stretti (char stringhe). Le "funzioni" dell'API di Windows non hanno suffissi e sono definite come macro che si espandono nella versione corretta in base alle impostazioni.

I T nomi (come _TCHAR e _tmain) sono per lo stesso scopo: sono le macro che si espandono per il nome giusto a seconda delle impostazioni di compilazione, in modo wchar_t e wmain per il supporto di caratteri estesi, o char e main per il personaggio stretto supporto.

L'idea è che se si scrive il codice utilizzando i nomi agnostici di tipo carattere (i nomi T), è possibile compilare il codice per utilizzare caratteri stretti (ASCII) o caratteri ampi (Unicode) senza modificarlo. Il compromesso è che il tuo codice è meno portabile.

+0

Grazie mille. Questa è una grande panoramica.Da un punto di vista pratico, la maggior parte degli sviluppatori tenta di evitare le convenzioni di Visual C++ di attenersi al C++ standard, oppure è l'assunto che se si sta sviluppando su Windows, è sufficiente utilizzare le convenzioni di Visual C++? –

+0

@ Sam: dipende. Se stai scrivendo un codice che fa un uso pesante dell'API di Windows, potrebbe essere molto utile per te usare 'TCHAR' e gli amici. Se stai scrivendo un codice che deve essere trasferito su più piattaforme, allora non vuoi usare 'TCHAR' e gli amici. Ho fatto pochissima programmazione C++ specifica per Windows, quindi probabilmente non sono la persona migliore da chiedere. Tutti i principali progetti su cui ho lavorato in C++ hanno avuto la portabilità come requisito principale. –

+2

@ Sam: Dal momento che dici di essere nuovo alla programmazione in C++, ti consiglio vivamente di imparare a scrivere C++ portatile e di imparare a evitare le estensioni della lingua e le funzionalità specifiche della piattaforma laddove possibile. Prova a scrivere codice dipendente dalla piattaforma solo quando è necessario (ad es., Quando devi interagire con il sistema operativo o usare funzionalità non accessibili attraverso la libreria standard C++). Quando devi utilizzare il codice specifico della piattaforma, prova a isolarlo il più possibile in modo da poterlo facilmente trasferire su altre piattaforme, se necessario. –

5

Perché Microsoft ha deciso che il modo migliore per aggiungere il supporto Unicode per C++ è stato quello di aggiungere un tipo TCHAR, che è #defined a uno o charwchar_t a seconda del valore del progetto Proprietà Proprietà> Configurazione> Generale> Set di caratteri. _tmain è anche # definito su main (che prende char s) o wmain (che prende wchar_t s) in base a tale impostazione.

+0

Davvero utile da sapere! Grazie. –

+2

@Sam: Sfortunatamente il gruppo SO Windows è specializzato in C, quindi hanno usato #define invece di typedef e le macro invece delle funzioni inline. Questo ha introdotto migliaia di cattivi macro nelle intestazioni di Windows, che noterete quando uno di essi corrisponde accidentalmente a uno dei nomi delle vostre funzioni. :-( –

+1

Gli sviluppatori Unix, d'altra parte, hanno deciso che il modo migliore per aggiungere il supporto Unicode al C++ era usare UTF-8. – dan04

Problemi correlati