7
votes

Disponibilité de C ++ 11 Caractéristiques

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.

La manière standard de signaler quelle spécification le compilateur prend en charge entièrement via le __ Cplusplus macro prédéfinie. Cependant, les principaux fournisseurs déclarent __ cplusplus = 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é.

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).

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.


6 commentaires

GCC a une valeur différente pour __ cplusplus en fonction du -std = ... . 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.


3 Réponses :


-1
votes

Je pense que beaucoup des fonctionnalités C ++ 11 sont disponibles sur GCC 4.8 également. Compilez votre programme avec -std = C ++ 11 option.

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.


17 commentaires

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 (ou -std = c ++ 0x 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 .


@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 ? 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 , vous devez utiliser -std = c + +11 . Les valeurs de -std = sont décrites sur Options de dialecte , où il vous indiquera que -std = c ++ 1y signifie la même chose que -std = C ++ 14 .


@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 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 :)



1
votes

g ++ / clang ++ ne pas avoir C ++ 11 activé par défaut, pas même les dernières versions. Chaque fois que vous compilez avec g ++ à l'aide de -std = c ++ 11 , votre macro __ cplusplus aura la valeur attendue.

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.

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 __ CplusPlus 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 ++ / clang ++ ) ou non implémenté du tout ( Vs ). 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.


7 commentaires

std = c ++ 11 ne s'applique pas à Visual Studio, ce n'est-il que, seulement g ++ ?


@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 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 (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



5
votes

Vous pourriez être intéressé par Test de fonctionnalité Macros , qui vous permettent de tester des fonctions spécifiques C ++ 11, C ++ 14 ou même C ++ 17, telles que __ cpp_static_asserat , __ cpp_lib_make_unique ou __ cpp_variable_templates . Clang et GCC soutiennent déjà cela, voir un Démo en direct .


5 commentaires

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!