2010-12-28 9 views
9

Spesso ho letto alcuni software che ritagliano alcune funzionalità C++ per essere compatibile con i compilatori C++ poveri/vecchi/esotici.Quali caratteristiche di C++ (98/03) non sono supportate da compilatori scadenti?

This one è solo l'ultimo che ho avuto in: Box2D non utilizza gli spazi dei nomi perché hanno bisogno di sostegno:

poveri compilatori C++ in cui il sostegno dello spazio dei nomi può essere imprevedibile

Un esempio più grande Posso pensare che Qt, che si basa su MOC, stia limitando molto l'uso dei template e stia evitando i template (beh, questo è almeno vero per Qt3 e versioni precedenti, Qt4 lo fa per lo più per mantenere le loro convenzioni).


Mi chiedo quali compilatori sono così poveri?
Ci sono lots of C++ compilers là fuori (non ne ho mai sentito parlare la maggior parte di loro), ma mi auguro che tutti supportino le più comuni (/ semplici?) Funzionalità C++ come gli spazi dei nomi (a meno che non siano morti); non è questo il caso?

Quali sono le funzioni più non supportate?
Posso facilmente aspettarmi la mancanza di modelli esterni, forse la specializzazione parziale dei template e caratteristiche simili. Al massimo anche RTTI o eccezioni, ma non avrei mai sospettato di spazi dei nomi.

+2

Hmm. Apparentemente, Box2D "ha iniziato la sua vita" all'inizio del 2006. Sembra che il lato in ritardo eviti i namespace. Ma Qt3 risale a un tempo in cui non esisteva un compilatore Windows C++ decente, e da allora il suo slancio lo ha portato avanti. – aschepler

+2

Si potrebbe notare che il MOC (Meta Object Compiler) di QT non ha davvero nulla a che fare con l'avere o meno di una caratteristica C++ o l'altra. L'ho sempre considerato come una funzione aggiuntiva (utile) che semplifica la programmazione con Qt rispetto al tentativo di implementare il proprio set di funzionalità tramite puro C++. –

+0

@Martin: per quanto ne so con C++ 03 è relativamente semplice implementare quasi tutto ciò che viene utilizzato per MOC, in particolare il meccanismo signal/slot (vedi boost.signal) che credo sia la caratteristica più importante per cui MOC ha stato creato. – peoro

risposta

8

Nella mia esperienza, le persone hanno solo paura di cose nuove e soprattutto di cose che hanno rotto su di loro una volta, 20 decenni fa. Non c'è alcun motivo valido contro l'utilizzo di spazi dei nomi in qualsiasi cosa scritta durante questo secolo.

Se stai cercando cose da sballare però, se ti capita di prendere di mira Windows non troppo tempo fa, dovevi fare molto di più che lanciare funzionalità da C++ e non usarle, dovevi usare una sintassi diversa . I modelli vengono in mente come una delle funzionalità supportate peggiori in VC. Sono diventati molto migliori ma a volte falliscono.

Un altro che non è supportato da quel particolare compilatore (ANCORA!) Sta sovraccaricando le funzioni virtuali per restituire i puntatori del tipo derivato ai tipi restituiti dalla versione base quando si utilizza MI. VC è semplicemente fuori di testa e si finisce per dover fare virtual_xxx() e fornire funzioni "xxx()" non virtuali per replicare il comportamento standard.

+0

Err ... Century è un po 'forte considerando che il linguaggio in sé non ha nemmeno un secolo: P Ma +1. (E 20 decadi? Non conosco nessuno con più di 200 anni ...) –

+3

@Billy: Il linguaggio è stato standardizzato nel secolo scorso, però. – sbi

+0

@sbi: Ah ... vedo ora. Ok. –

0

Qt non utilizza i modelli molto perché è più vecchio dei modelli.

+0

Questo è vero, ma in realtà non risponde alla domanda. –

+0

Probabilmente questo dovrebbe essere un commento alla domanda. – sbi

+4

Qt ha più problemi di questo. Anche una classe Q_OBJECT non può essere un modello, il MOC vomiterà. Uno dei maggiori problemi con Qt, una libreria altrimenti eccezionale, è l'uso di "estensioni" che in realtà rompono la lingua per trasformare C++ in Python. –

2

Fondamentalmente tutto ciò che è stato aggiunto come parte del processo di standardizzazione in C++ 98. Cioè:

  • Modelli (specializzazione Non solo parziale - voglio dire tutti i modelli)
  • eccezioni (spesso perché questo richiede il supporto di runtime/in testa - sono spesso non disponibili su cose come microcontrollori)
  • Namespace
  • RTTI

Se si va ancora più antica, è possibile aggiungere

  • Quasi tutto nella libreria standard.

Diversi vecchi compilatori sono semplicemente cattivi; OTOH non raccomanderei fortemente di preoccuparsi di loro. Esistono già diversi compilatori validi e disponibili per gli standard ragionevolmente disponibili, disponibili per quasi tutte le piattaforme di cui sono a conoscenza (principalmente tramite G ++).

+2

Inferno, davvero? Quali compilatori al giorno d'oggi non supportano correttamente spazi dei nomi, modelli e il piccolo RTTI C++ ha ?? C'è qualcosa di rilevante in quell'elenco di compilatori? Ne dubito seriamente. – sbi

+0

@sbi: stavo dando per scontato che l'OP stesse parlando di compilatori più vecchi/oscuri dato che la maggior parte dei compilatori moderni supportano praticamente tutto in C++ 03 piuttosto bene. –

+2

Lo sviluppo del software moderno non dovrebbe soddisfare quei vecchi compilatori. Non puoi nemmeno chiamarli C++. Ora che il linguaggio è standardizzato, sono tutti non conformi e implementano un linguaggio LIKE C++ ma non C++. I moderni metodi di progettazione richiedono REQUIRE un compilatore conforme e quindi limitando te stesso a supportare quelli che non sono seriamente ostacolati nell'uso di molti strumenti molto potenti. –

4

Quali sono le funzioni più non supportate?

Let's abstract away export, che, purtroppo, è stato un esperimento fallito. Quindi, per il conteggio degli utenti del compilatore, questa è probabilmente ricerca in due fasi, che Visual C++ continua a non implementare correttamente. E VC ha un sacco di utenti.

+1

+1 per l'esportazione: deve essere _la_ minima supportata caratteristica C++ 03. –

+0

@Charles: Sì, ma "export" è così ovvio, ho pensato che quando la mia risposta sarà arrivata ci saranno circa 10 risposte che urlano "export". – sbi

+1

Tanto che ignoro totalmente e dimentico che esiste persino, proprio come ogni compilatore che uso. –

1

Gli spazi dei nomi sono stati circa per sempre. Alcuni dei posti più scuri nei modelli, forse. Ma gli spazi dei nomi? Non c'è modo. Anche con i modelli, la vasta, vasta maggioranza degli scenari di utilizzo va bene. Alcuni compilatori non sono perfetti (sono software), ma non supportano una funzionalità C++ 03 che non è esportata? Questo non succede. La maggior parte dei compilatori estendono la lingua, non , riducono lo e si stanno muovendo per supportare C++ 0x.

RTTI e le eccezioni sono spesso accusate di implementazioni poco efficienti, ma non di scarsa conformità dell'implementazione.

1

Se si sta programmando nel flusso principale con un compilatore di flusso principale di solito si trova tutto nello standard C++ 03 supportato (tranne l'esportazione come menzionato da sbi (ma di nuovo nessuno ha usato la funzione (poiché non era supportato)). Più lontano dal flusso principale il compilatore è il meno funzioni di solito (ma sono tutti in movimento (alcuni più lentamente di altri))

È solo quando si arriva a hardware meno utilizzato che ha il suo proprietario il compilatore che supporta le funzionalità iniziano a diminuire

L'esempio principale sono i dispositivi mobili e i relativi compilatori (anche se a causa della loro popolarità nello stream principale in rec anni questi compilatori vengono aggiornati più rapidamente di prima).

Un esempio secondario sarebbe dai dispositivi SOC. I compilatori sono così specifici che di solito sono compilatori interni e ottengono tutto il lavoro su di loro quanto la società SOC può permettersi e di conseguenza tendono a ritardare di molto (o almeno) dietro altri compilatori.

+0

No way Martin! Torna coi piedi per terra. Sto usando l'ultimo OSX Snow Leopard e il gcc che viene fornito non supporta affatto le caratteristiche di C++ 03. E dal momento che ho solo internet wireless non posso aggiornarlo, anche se Apple si scoccia (che potrebbe non farlo). – Yttrill

+2

@Yttrill: se ricordo male, Apple usa GCC 4.2.1, che [è stato rilasciato il 18 luglio 2007] (http://gcc.gnu.org/gcc-4.2/). A meno che tu non stia usando una vecchia versione di GCC 3, rilasciata intorno al 2000 (di cui dubito), sono abbastanza sicuro che il tuo GCC supporti molte funzionalità di C++ 03. Forse stai parlando di C++ 0x? – peoro

+2

@Yttrill: devi confondere gli standard. Namespace, Modelli, RTTI ed Eccezioni sono disponibili praticamente ovunque, incluso OSX. –

Problemi correlati