/std (Spécifier la version de la norme du langage)

Activez les fonctionnalités du langage C et C++ prises en charge dans la version spécifiée de la norme du langage C ou C++.

Syntaxe

/std:c++14
/std:c++17
/std:c++20
/std:c++latest
/std:c11
/std:c17
/std:clatest

Notes

Les options /std sont disponibles dans Visual Studio 2017 et les versions ultérieures. Ces options servent à contrôler les fonctionnalités de la norme du langage de programmation C ou C++ spécifiques à une version ISO qui sont activées durant la compilation de votre code. Ces options vous permettent de désactiver la prise en charge de certaines nouvelles fonctionnalités de langage et de bibliothèque susceptibles de casser votre code existant si celui-ci est conforme à une version particulière de la norme du langage.

Le compilateur Microsoft C++ dans Visual Studio 2017 et les versions ultérieures ne prend pas en charge les modes de normes C++ antérieurs à C++14 (/std:c++14). Une telle prise en charge n’est pas prévu. Comme solution de contournement partielle, il est possible d’utiliser des ensembles d’outils de compilateur Visual C++ plus anciens qui n’ont pas implémenté de fonctionnalités provenant de normes ultérieures. Pour plus d’informations sur l’installation et l’utilisation d’ensembles d’outils de compilateur plus anciens dans Visual Studio, consultez Utiliser le multi-ciblage natif dans Visual Studio pour générer d’anciens projets.

Prise en charge des normes C++

L’option /std en vigueur durant une compilation C++ peut être détectée au moyen de la macro de préprocesseur _MSVC_LANG. Pour plus d’informations, consultez Macros de préprocesseur.

Important

La définition de la macro __cplusplus sur la valeur 199711L étant une condition dans certaines instances de code existantes, le compilateur MSVC ne modifie pas la valeur de cette macro, sauf si vous choisissez explicitement de le faire en définissant /Zc:__cplusplus. Spécifiez /Zc:__cplusplus et l’option /std pour définir __cplusplus sur la valeur appropriée.

/std:c++14
L’option /std:c++14 active les fonctionnalités spécifiques aux normes C++14 implémentées par le compilateur MSVC. Cette option est celle par défaut pour le code compilé en C++. Elle est disponible à partir de Visual Studio 2015 Update 3.

Cette option désactive la prise en charge du compilateur et de la bibliothèque standard pour les fonctionnalités modifiées ou nouvelles dans les versions plus récentes de la norme du langage. Toutefois, elle ne désactive pas certaines fonctionnalités C++17 déjà implémentées dans les versions précédentes du compilateur MSVC. Pour plus d’informations, consultez Conformité du langage Microsoft C/C++. Les tableaux indiquent quelles fonctionnalités C++17 sont activées lorsque vous spécifiez /std:c++14.

Les fonctionnalités suivantes restent activées lorsque l’option /std:c++14 est spécifiée pour éviter les changements cassants pour les utilisateurs qui ont déjà créé des dépendances sur les fonctionnalités disponibles dans ou avant Visual Studio 2015 Update 2 :

/std:c++17
L’option /std:c++17 active les fonctionnalités et le comportement spécifiques à la norme C++17. Elle active l’ensemble des fonctionnalités C++17 implémentées par le compilateur MSVC. Cette option désactive la prise en charge du compilateur et de la bibliothèque standard pour les fonctionnalités nouvelles ou modifiées après C++17. Elle désactive spécifiquement les modifications post-C++17 dans la norme C++ et les versions du brouillon de travail. Elle ne désactive pas les mises à jour rétroactives des défauts de la norme C++. Cette option est disponible à partir de Visual Studio 2017 version 15.3.

Selon le niveau de mise à jour ou la version du compilateur MSVC, les fonctionnalités C++17 peuvent ne pas être entièrement implémentées ou conformes quand vous spécifiez l’option /std:c++17. Pour une vue d’ensemble de la conformité du langage C++ dans Visual C++ par version, consultez Conformité du langage Microsoft C/C++.

/std:c++20
L’option /std:c++20 active les fonctionnalités et le comportement spécifiques à la norme C++20. Disponible à partir de Visual Studio 2019 version 16.11, elle active l’ensemble des fonctionnalités C++20 implémentées par le compilateur MSVC, à l’exception de std::format, des extensions de mise en forme <chrono> C++20, et des fabriques de plages et des adaptateurs de plage à partir de <ranges>. Ces fonctionnalités sont toujours disponibles uniquement sous /std:c++latest.

L’option /std:c++20 désactive la prise en charge du compilateur et de la bibliothèque standard pour les fonctionnalités nouvelles ou modifiées après C++20. Elle désactive spécifiquement les modifications post-C++20 dans la norme C++ et les versions du brouillon de travail. Elle ne désactive pas les mises à jour rétroactives des défauts de la norme C++.

/std:c++latest
L’option /std:c++latest active toutes les fonctionnalités du compilateur et de la bibliothèque standard actuellement implémentées proposées pour le prochain projet de norme, ainsi que certaines fonctionnalités expérimentales et en cours. Cette option est disponible à partir de Visual Studio 2015 Update 3.

Selon le niveau de mise à jour ou la version du compilateur MSVC, les fonctionnalités C++17, C++20 ou C++23 proposées peuvent ne pas être entièrement implémentées ou conformes quand vous spécifiez l’option /std:c++latest. Nous vous recommandons d’utiliser la dernière version de Visual Studio pour une conformité maximale aux normes. Pour obtenir une vue d’ensemble de la conformité du langage et de la bibliothèque C++ dans Visual C++ par version, consultez Conformité du langage Microsoft C/C++.

Dans les versions de Visual Studio 2019 antérieures à la version 16.11, /std:c++latest est nécessaire pour activer toutes les fonctionnalités du compilateur et de la bibliothèque standard de C++20.

Pour obtenir la liste des fonctionnalités de langage et de bibliothèque prises en charge, consultez Nouveautés pour C++ dans Visual Studio.

L’option /std:c++latest n’active pas les fonctionnalités conservées par le commutateur /experimental, mais peut être nécessaire pour les activer.

Remarque

Les fonctionnalités du compilateur et de la bibliothèque activées par /std:c++latest peuvent apparaître dans une future norme C++. Les fonctionnalités qui n’ont pas été approuvées peuvent faire l’objet de changements cassants ou peuvent être supprimées sans préavis, et sont fournies en l’état.

Prise en charge des normes C

Vous pouvez appeler le compilateur Microsoft C à l’aide de l’option du compilateur /TC ou /Tc. Il est utilisé par défaut pour le code qui a une extension de fichier .c, sauf si elle est remplacée par une option /TP ou /Tp. Le compilateur C par défaut (autrement dit, le compilateur quand /std:c11 ou /std:c17 n’est pas spécifié) implémente ANSI C89, mais inclut plusieurs extensions Microsoft, dont certaines font partie de l’ISO C99. Certaines extensions Microsoft pour C89 peuvent être désactivées à l’aide de l’option du compilateur /Za, mais d’autres restent en vigueur. Il n’est pas possible de spécifier une conformité C89 stricte. Le compilateur n’implémente pas plusieurs fonctionnalités requises de C99. Il n’est donc pas non plus possible de spécifier la conformité C99.

/std:c11
L’option /std:c11 active la conformité ISO C11. Elle est disponible à partir de Visual Studio 2019 version 16.8.

/std:c17
L’option /std:c17 active la conformité ISO C17. Elle est disponible à partir de Visual Studio 2019 version 16.8.

Étant donné que le nouveau préprocesseur est nécessaire pour prendre en charge ces normes, les options du compilateur /std:c11 et /std:c17 définissent automatiquement l’option /Zc:preprocessor. Si vous souhaitez utiliser le préprocesseur traditionnel (hérité) pour C11 ou C17, vous devez définir l’option du compilateur /Zc:preprocessor- explicitement. La définition de l’option /Zc:preprocessor- peut entraîner un comportement inattendu et n’est pas recommandée.

Remarque

Au moment de la mise en production et jusqu’à Visual Studio 2019 version 16.10, les bibliothèques SDK Windows et UCRT installées par Visual Studio ne prennent pas encore en charge le code C11 et C17. Une version mise à jour du SDK Windows et d’UCRT est requise. Pour plus d’informations et pour obtenir des instructions d’installation, consultez Installer la prise en charge de C11 et C17 dans Visual Studio.

Lorsque vous spécifiez /std:c11 ou /std:c17, MSVC prend en charge toutes les fonctionnalités de C11 et C17 requises par les normes. Les options du compilateur /std:c11 et /std:c17 activent la prise en charge de ces fonctionnalités :

L’IDE utilise les paramètres C pour IntelliSense et la mise en surbrillance du code lorsque vos fichiers sources ont une extension de fichier .c, ou lorsque vous spécifiez l’option du compilateur /TC ou /Tc. Actuellement, IntelliSense en C met en surbrillance les mots clés _Alignas, _Alignof, _Noreturn et _Static_assert, mais pas les macros équivalentes définies dans les en-têtes standard : alignas, alignof, noreturn et static_assert.

Étant donné que C17 est en grande partie une version de résolution de bogues de l’ISO C11, la prise en charge de MSVC pour C11 inclut déjà tous les rapports de défaut pertinents. Il n’existe aucune différence entre les versions C11 et C17, à l’exception de la macro __STDC_VERSION__. Elle s’étend sur 201112L pour C11 et 201710L pour C17.

Le compilateur ne prend pas en charge la plupart des fonctionnalités facultatives de l’ISO C11. Plusieurs de ces fonctionnalités facultatives de C11 étaient les fonctionnalités requises de C99 que MSVC n’a pas implémentées pour des raisons architecturales. Vous pouvez utiliser les macros de test de fonctionnalités telles que __STDC_NO_VLA__ pour détecter les niveaux de prise en charge du compilateur pour les fonctionnalités individuelles. Pour plus d’informations sur les macros prédéfinies spécifiques à C, consultez Macros prédéfinies.

  • Il n’existe aucune prise en charge multithreading, atomique ou de nombre complexe conforme.

  • La prise en charge de aligned_alloc est manquante, en raison de l’implémentation du segment de mémoire Windows. L’alternative consiste à utiliser _aligned_malloc.

  • La prise en charge du rapport de défaut 400 n’est actuellement pas implémentée pour realloc car cette modification interrompt l’ABI.

  • La prise en charge du tableau de longueur variable (VLA) n’est pas planifiée. Les tableaux de longueur variable fournissent des vecteurs d’attaque comparables à gets, qui est obsolète et dont la suppression est prévue.

/std:clatest
L’option /std:clatest se comporte comme le commutateur /std:c++latest pour le compilateur C++. Le commutateur active toutes les fonctionnalités du compilateur et de la bibliothèque standard actuellement implémentées pour le prochain projet du standard C ainsi que certaines fonctionnalités expérimentales et en cours.

Pour plus d’informations, consultez la section fonctionnalités de la bibliothèque standard C de Conformité du langage Microsoft C/C++.

Pour définir cette option du compilateur dans l'environnement de développement Visual Studio

  1. Ouvrez la boîte de dialogue Pages de propriété du projet. Pour plus d’informations, consultez Définir le compilateur C++ et les propriétés de build dans Visual Studio.

  2. Sélectionnez la page de propriétés Propriétés de configuration>C/C++>Langage.

  3. Dans Norme du langage C++ (ou pour C, Norme de langage C), choisissez la norme de langage à prendre en charge dans le contrôle déroulant, puis choisissez OK ou Appliquer pour enregistrer vos changements.

Voir aussi

/Zc:__cplusplus[-]
Options du compilateur MSVC
Syntaxe de ligne de commande du compilateur MSVC