Les fournisseurs de compilation ont été adoptés C ++ 11 fonctionnalités au coup par coup, qui était prévisible, car nombre d'entre eux ne sont pas facilement mis en œuvre. p>
La manière standard de signaler quelle spécification le compilateur prend en charge entièrement via le Je voudrais commencer à utiliser les fonctionnalités C ++ 11, lorsqu'elles sont disponibles (et retombées au code existant lorsqu'ils ne le sont pas). Cependant, mon code doit prendre en charge de nombreux compilateurs, y compris des compilateurs propriétaires que je n'ai peut-être pas accès à l'utilisation. Existe-t-il une façon standard de savoir quelles fonctionnalités C ++ 11 sont disponibles dans un compilateur, sans savoir spécifiquement quel compilateur est utilisé? (Si un compilateur se comporte de manière non standard, il est acceptable que le comportement de détection soit incorrect). P>
Remarque: cette question est une généralisation de ma question ' Disponibilité de static_assert C ++ 11 < / a> ', qui n'a pas été très bien reçu, car je pense que ma motivation était mal comprise. p> __ Cplusplus code> macro prédéfinie. Cependant, les principaux fournisseurs déclarent
__ cplusplus code> = 199711L, ce qui signifie qu'ils ne supportent que complètement C ++ 98 (par exemple, MSVC14). Ceci (probablement) signifie qu'ils ne prennent pas pleinement en charge la spécification C ++ 11, même s'ils ont peut-être mis en place une part de lion de la fonctionnalité. P>
3 Réponses :
Je pense que beaucoup des fonctionnalités C ++ 11 sont disponibles sur GCC 4.8 également. Compilez votre programme avec -std = C ++ 11 option. P>
Je pense que certaines des caractéristiques C ++ 11 étaient également dans GCC 4.6.3. Compiler l'option pour activer IT -STD = C ++ 0x. p>
GCC 4.7 incluait une partie importante de C ++ 11.
IIRC GCC 4.8 a toutes les fonctionnalités de langue C ++ 11. La plupart d'entre eux étaient disponibles dans GCC 4.7.
@Adam oui. Je pense que l'indicateur d'option compile est -std = gnu ++ 11, pas C ++ 11 sur GCC 4.8
Vous faites fondamentalement des trucs. Ce n'est pas trop difficile de vérifier cela.
@Marcglisse vient de vérifier. GCC 4.9 n'active pas C ++ 11 par défaut. Merci de le pointer.
Je suppose que la dernière version les a permis par défaut, pour le repos, vous devrez passer -std = C ++ 1Y.
@Abhinavgauliyal no, -Std-c ++ 11 code> (ou
-std = c ++ 0x code> pour les versions plus anciennes sans supplt complet) pour C ++ 11. Qu'est-ce que c'est avec des gens qui font des déclarations erronées aujourd'hui?
@Abhinavgauniyal s'il vous plaît ne devinez pas (il est prévu de faire C ++ 11 la valeur par défaut en G ++ - 6.1 l'année prochaine ...).
@Abhinavgaulidyal, il ne supporte pas C ++ 11. y! = 1 code>.
@juanchopanza oui je sais, c'est pourquoi j'ai effacé que vous pouvez écrire y = 1 ou 4 et ainsi de suite. Bien que vous puissiez écrire y aussi.
@Abhinavgauniyal C ++ 1Y ne couvre pas C ++ 11. La commande est C ++ 0x, C ++ 11, C ++ 1Y, C ++ 14. C ++ 11 devait être publié avant 2010, donc 0x, mais il a glissé et est devenu C ++ 11.
@Abhinavgauliyal c'est pourquoi vous avez dit y = 1, 4 ...? Parce que y! = 1 code>? Veuillez cesser de produire des non-sens qui confondent les nouveaux arrivants.
@juanchopanza & Dave, je me tromperais peut-être ici, pouvez-vous me fournir des ressources pour cela? Je pensais que C ++ 1Y signifiait permettre toutes les fonctionnalités jusqu'à C ++ 14.
@Abhinavgauliyy oui, donc si vous voulez C ++ 11 plutôt que C ++ 14, vous ne devez pas utiliser -std = c ++ 1y code>, vous devez utiliser
-std = c + +11 code>. Les valeurs de
-std = code> sont décrites sur Options de dialecte , où il vous indiquera que
-std = c ++ 1y code> signifie la même chose que
-std = C ++ 14 code>.
@hvd merci. Je vais uppoter pour la visibilité afin que les nouveaux arrivants ne soient pas égarés par mon commentaire boiteux.
@Abhinavgauniyal Fonction-Wise, C ++ 1y couvre effectivement le jeu de caractéristiques de C ++ 11. Mais il serait tout à fait tort de penser que c ++ 1y peut signifie i> C ++ 11. Cela ne signifie pas: cela signifie une superset de ses caractéristiques (et même si je ne connais pas la spécification en détail, il est possible que certaines des fonctionnalités de C ++ 11 soient modifiées de manière incompatible)
@Dave, je voulais dire couvrir toutes les fonctionnalités définies jusqu'à C ++ 14, n'a pas réalisé que la mise en œuvre pourrait contenir des modifications non compatibles. Vous avez raison :)
vs semble avoir toutes les fonctionnalités activées par défaut, merci @comic, mais elle ne met pas à jour la macro car elle n'est pas encore complètement complitive C ++ 11. P>
En ce qui concerne la détection de "C ++ 11 Disponibilité" pour un compilateur générique, je ne suis pas au courant d'une manière portable de le faire, à moins que vous ne vérifiez que le g ++ code> /
clang ++ code> ne pas avoir C ++ 11 activé par défaut, pas même les dernières versions. Chaque fois que vous compilez avec
g ++ code> à l'aide de
-std = c ++ 11 code>, votre macro
__ cplusplus code> aura la valeur attendue. P>
__ CplusPlus code> macro. Mais comme vous l'avez observé, la macro ne peut pas être mise en œuvre pour certains compilateurs par défaut (comme c'est le cas pour
g ++ code> /
clang ++ code>) ou non implémenté du tout (
Vs code>). Votre seul choix à ce stade semble être un outil externe comme CUMAKE, qui peut détecter le compilateur et conditionné sur la cmake de type compilateur peut alors définir une macro que vous pouvez enregistrer dans votre code pour activer C ++ 11. P >
std = c ++ 11 code> ne s'applique pas à Visual Studio, ce n'est-il que, seulement
g ++ code>?
@Muertoexcobito Non, il devrait y avoir un drapeau spécifique pour VS également (je ne l'utilise pas et je ne le sais pas).
@Muertoexcobito non vs, mais pas seulement GCC. D'autres utilisent le drapeau aussi (par exemple, clang ++)
Visual Studio pas i > Besoin d'une option de compilation pour activer C ++ 11 fonctionnalités . Toutes les fonctionnalités disponibles sont toujours activées et ne peuvent pas être activées ou désactivées.
@Comic Merci, j'ai corrigé la réponse. J'utilise g ++ et je ne savais pas à propos de vs.
@Vsoftco GCC n'active pas C ++ 11 Par défaut, mais compose certaines fonctionnalités de celui-ci, même sans -std = c ++ 11 code> (et émet un avertissement sur le manque de drapeau).
Je pense que c'est parce qu'il utilise des extensions GNU C ++ 11 par défaut, mais la macro n'est pas mise à jour
Vous pourriez être intéressé par Test de fonctionnalité Macros forts> , qui vous permettent de tester des fonctions spécifiques C ++ 11, C ++ 14 ou même C ++ 17, telles que __ cpp_static_asserat code> ,
__ cpp_lib_make_unique code> ou
__ cpp_variable_templates code>. Clang et GCC soutiennent déjà cela, voir un Démo en direct strong> . p>
Dernière proposition pour cela Même Inclut les suggestions pour les macros pour les prochaines caractéristiques C ++ 17.
GCC les soutient également, mais pas Visual Studio Afaik, cela va donc être difficile pour l'OP.
@Marcglisse ouais, GCC fait - ajusté mon exemple. Je pense toujours que cela est remarquable, même si l'OP pourrait utiliser VC ++ -
Cela ressemble beaucoup à ce que je cherchais. De toute évidence, cela n'est pas encore disponible sur tous les compilateurs, mais cela va être standard. Va vérifier divers soutien du compilateur, mais j'accepterai probablement cette réponse.
Donc, il semble que MSVC n'a pas de soutien pour ceux-ci, ce qui est malheureux. Cependant, cela semble toujours être le moyen conforme le plus standard d'atteindre ce que je cherche (alors je l'accepte). Pour les compilateurs qui ne prennent pas en charge cette fonctionnalité, mais supportent toujours les fonctionnalités C ++ 11 (ou 14/17) que j'aimerais utiliser, je peux définir les standard sur une base de compilateur par compilateur dans une "configuration ' entête. Merci!
GCC a une valeur différente pour
__ cplusplus code> en fonction du
-std = ... code>. Google pour WG21 + SG10 pour les macros de fonctionnalités recommandées (non pris en charge par VS). Boost, Cmake et d'autres personnes fournissent également des moyens de détecter les fonctionnalités disponibles.
@Marcglisse (et les intervenants) Merci pour l'information sur GCC (ne savait pas que - je travaille généralement avec VS). Cependant, c'est un compilateur spécifique, je veux savoir sur la détection de la disponibilité en général.
@Muertoexcobito Vous ne pouvez pas détecter la "disponibilité des fonctionnalités C ++ 11" de la source. Vous devez consulter la documentation du compilateur, en ligne ou dans le manuel.
Versions récentes de CUPAKE Permettre une fonctionnalité assez puissante Détection sur les compilateurs .
@Vsoftco mais, comme je l'ai dit, je n'ai peut-être pas accès à chaque compilateur que mon code sera compilé.
Vous auriez alors besoin d'un outil externe, comme Cmake. Vous ne pouvez pas via des macros.