2015-05-16 18 views
7

I produttori di compilatori hanno adottato caratteristiche C++ 11 frammentarie, il che era prevedibile, poiché molte di esse non sono facilmente implementabili.Disponibilità di funzionalità C++ 11

Il modo standard per segnalare quale specifica il compilatore supporta completamente è tramite la macro predefinita __cplusplus. Tuttavia, i principali fornitori stanno segnalando __cplusplus = 199711L, il che significa che supportano solo pienamente C++ 98 (ad esempio MSVC14). Questo (presumibilmente) significa che non supportano completamente le specifiche C++ 11, anche se possono aver implementato una parte del leone della funzionalità.

Vorrei iniziare a utilizzare le funzionalità di C++ 11, quando sono disponibili (e il fallback al codice esistente quando non lo sono). Tuttavia, il mio codice deve supportare molti compilatori, compresi i compilatori proprietari che potrei non avere accesso all'uso. Esiste un modo standard per sapere quali funzionalità di C++ 11 sono disponibili da un compilatore, senza sapere specificamente quale compilatore viene utilizzato? (se un compilatore si comporta in modo non standard, allora è accettabile che il comportamento di rilevamento sia errato).

NOTA: Questa domanda è una generalizzazione della mia domanda "Availability of static_assert c++11", che non è stata accolta molto bene, perché ritengo che la mia motivazione sia stata fraintesa.

+4

gcc ha un valore diverso per '__cplusplus' a seconda di' -std = ... '. Google per wg21 + sg10 per le macro delle funzioni consigliate (non supportate da VS). Boost, cmake e altri forniscono anche modi per rilevare le funzionalità disponibili. –

+0

@MarcGlisse (e rispondenti) Grazie per le informazioni su gcc (non lo sapevo - generalmente lavoro con VS). Tuttavia, è un compilatore specifico, voglio sapere di rilevare la disponibilità in generale. – MuertoExcobito

+0

@MuertoExcobito Non è possibile rilevare la "disponibilità di funzionalità C++ 11" dall'origine. È necessario consultare la documentazione del compilatore, online o nel manuale. – vsoftco

risposta

5

Potreste essere interessati a feature test macros, che consentono di testare per la specifica C++ 11, C++ 14 o anche C++ 17 caratteristiche, come ad esempio __cpp_static_assert, __cpp_lib_make_unique o __cpp_variable_templates. Clang e GCC lo supportano già, vedi live demo.

+0

La [ultima proposta per questo] (http://www.open-std.org/jtc1/sc22/wg21/docs /papers/2015/n4440.html) include anche suggerimenti per macro per le prossime funzionalità di C++ 17. – ComicSansMS

+0

Gcc li supporta anche, ma non Visual Studio AFAIK, quindi sarà difficile per l'OP. –

+0

@MarcGlisse Sì, GCC lo fa - ha corretto il mio esempio. Continuo a pensare che questo sia degno di nota, anche se l'OP potrebbe utilizzare VC++ - – Columbo

-1

Penso che molte delle funzionalità di C++ 11 siano disponibili anche su GCC 4.8. Compila il tuo programma con l'opzione -std = C++ 11.

Penso che alcune delle funzionalità di C++ 11 fossero anche in GCC 4.6.3. Compilare l'opzione per abilitarlo -std = C++ 0x.

+0

GCC 4.7 includeva anche una parte significativa di C++ 11. – Adam

+0

IIRC gcc 4.8 ha tutte le caratteristiche del linguaggio C++ 11. Molti di questi erano disponibili in gcc 4.7. – juanchopanza

+0

@Adam si. Penso che solo il flag di opzione di compilazione sia -std = gnu ++ 11, non C++ 11 su GCC 4.8 –

1

g++/clang++ non hanno C++ 11 abilitato di default, nemmeno le ultime versioni. Ogni volta che si compila con g++ utilizzando -std=c++11, la macro __cplusplus avrà il valore previsto.

VS sembra che tutte le funzionalità siano abilitate per impostazione predefinita, grazie a @Comic, ma non sta aggiornando la macro poiché non è ancora completamente compatibile con C++ 11.

Per quanto riguarda il rilevamento della "disponibilità C++ 11" per un compilatore generico, non sono a conoscenza di alcun modo portatile per farlo, a meno che non si controlli la macro __cplusplus. Tuttavia, come osservato, la macro potrebbe non essere implementata per alcuni compilatori per impostazione predefinita (come nel caso di g++/clang++) o non implementata affatto (VS). La tua unica scelta in questa fase sembra essere uno strumento esterno come CMake, che può rilevare il compilatore, e condizionale al tipo di compilatore CMake può quindi definire alcune macro che puoi controllare nel tuo codice per abilitare C++ 11.

+0

'std = C++ 11' non si applica a Visual Studio sebbene lo faccia, solo' g ++ '? – MuertoExcobito

+0

@MuertoExcobito no, dovrebbe esserci anche una bandiera specifica per VS (non la uso e non la conosco). – vsoftco

+0

@MuertoExcobito Non VS, ma non solo gcc. Altri usano il flag anche (es. Clang ++) – juanchopanza