JetBrains présente les nouveautés apportées par la prise en charge du C++ moderne dans CLion, l'EDI JetBrains dédié à C et C++
JetBrains est une société à responsabilité limitée internationale spécialisée dans le développement de logiciels, qui conçoit des outils destinés aux développeurs et aux chefs de projet. JetBrains propose divers environnements de développement intégrés (EDI), tels que IntelliJ IDEA, PyCharm, WebStorm et CLion. CLion (prononcé « sea lion ») est un EDI C et C++ pour Linux, macOS et Windows intégré au système de compilation CMake. La version initiale prend en charge les compilateurs GNU Compiler Collection (GCC) et Clang, ainsi que le débogueur GDB, LLDB et Google Test.
Le C++ moderne rend les techniques avancées de haute performance plus accessibles, grâce à des fonctionnalités telles que les calculs à la compilation, les abstractions sans surcoût et le code de modèles expressif. Mais à mesure que votre base de code s'étoffe, votre capacité à utiliser ces techniques de manière productive dépend fortement de la façon dont vos outils les comprennent. Sans une prise en charge adéquate par le moteur de langage, les fonctionnalités du C++ moderne peuvent entraîner des faux positifs, des problèmes de navigation et des complétions manquantes, plutôt que des gains de productivité.
La prise en charge de ces techniques est au cœur de la conception du moteur de langage de CLion. JetBrains vient de présenter les améliorations les plus intéressantes introduites dans les versions récentes. Pour bénéficier de toutes les mises à jour mentionnées ici, vous devez disposer de CLion 2026.1 ou d'une version ultérieure avec le moteur CLion Nova activé.
Fonctionnalités C++26
C++26 est une version majeure comprenant des dizaines de nouvelles fonctionnalités, notamment celles qui étendent les capacités de compilation et simplifient la métaprogrammation. CLion prend désormais en charge toutes les fonctionnalités de C++26 à l'exception de la réflexion, que l'équipe CLion prévoit d'implémenter dans la prochaine version 2026.2 (CPP-48365). Voici quelques exemples :
Directive de préprocesseur #embed : cette fonctionnalité vous permet d'intégrer le contenu de fichiers binaires – tels que des images, des icônes ou du texte encodé – directement dans votre code source lors de la compilation sous forme de tableaux d'octets.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 constexpr unsigned char logo[] = { #embed "logo.png" }; constexpr std::size_t logo_size = sizeof(logo);
Avant C++26, cela nécessitait généralement des outils externes ou des scripts personnalisés pour convertir les fichiers binaires en tableaux C, que vous deviez ensuite synchroniser manuellement avec les fichiers source – #embed supprime cette étape.
Indexation des packs : vous pouvez désormais accéder directement aux éléments individuels d'un pack de paramètres via l'index de l'élément en utilisant le format pack...[index], par exemple, values...[0], values...[2], et ainsi de suite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template <std::size_t I, typename... Ts> constexpr auto element_at(Ts... args) { // Use pack indexing to access an element return args...[I]; }
Auparavant, l'extraction d'un élément spécifique nécessitait des spécialisations de modèles récursives ou des utilitaires d'aide. Désormais, c'est aussi simple que d'indexer un tableau.
Amis variadiques : cette fonctionnalité vous permet d'accorder l'amitié à toutes les classes d'un pack de paramètres de modèle. Cela s'avère particulièrement utile dans les schémas où un groupe de types étroitement liés – tels que les nœuds d'une structure de données – doit accéder aux membres de classe privés les uns des autres.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 template <class... Ts> class X { int data = 42; friend Ts...; }; struct A { int get(X<A> x) { return x.data; } }; struct B { int get(X<A, B> x) { return x.data; } };
Auparavant, chaque amitié devait être déclarée individuellement, ce qui devenait fastidieux à mesure que le nombre de types augmentait.
Mises à jour de la prise en charge de constexpr.
Le code de compilation en C++ est puissant, mais son débogage nécessite souvent de gérer des erreurs de compilation cryptiques et peu de contexte. Les dernières versions de CLion apportent des fonctionnalités et des améliorations qui facilitent considérablement le débogage et la validation du code constexpr.
Débogueur Constexpr
CLion 2025.3 a introduit le débogueur Constexpr, le premier débogueur intégré à l'EDI permettant de parcourir pas à pas les évaluations à la compilation du code constexpr et consteval. Depuis le débogueur, vous pouvez inspecter les variables locales, parcourir la pile d'appels et même revenir en arrière à chaque étape d'évaluation.
Cela s’avère particulièrement utile lorsque l’évaluation d’une constante échoue. Au lieu de déchiffrer les erreurs de compilation, vous pouvez exécuter l’évaluation jusqu’à l’échec et laisser CLion s’arrêter exactement au point où le problème s’est produit, avec le contexte complet à l’écran.
Détection précoce des échecs d'évaluation constexpr.
L'EDI propose désormais une inspection qui détecte les échecs d'évaluation constexpr, par exemple les appels de fonction non constexpr ou les erreurs logiques. La fenêtre contextuelle correspondante affiche une trace d'évaluation pour vous aider à identifier et à corriger plus facilement les problèmes.
Vous pouvez également utiliser le débogueur Constexpr pour examiner la cause d’un problème plus en détail en cliquant sur « Exécuter l’évaluation jusqu’à l’échec » dans la fenêtre contextuelle. Le débogueur Constexpr s’exécutera et s’arrêtera au point de l’évaluation ayant échoué. Vous pouvez ensuite utiliser les actions « Entrer », « Passer », « Reculer » et d’autres pour déboguer le code. Pour en savoir plus, consultez la documentation.
Autres mises à jour de l'évaluation constexpr.
L'équipe de CLion a étendu les capacités d'évaluation constexpr de CLion afin de couvrir un plus large éventail de constructions et de fonctionnalités C++, notamment :
- les instructions switch,
- les instructions if avec initialiseurs
- les liaisons structurées
- l'initialisation par défaut triviale
- operator == par défaut de C++20
L'exemple suivant montre l'avertissement de CLion lorsque l'évaluation de operator == échoue :
L'évaluateur constexpr ne prend toujours pas en charge certaines constructions. Vous pouvez suivre l'avancement de nos travaux dans les tickets YouTrack correspondants et voter pour ceux qui vous semblent les plus importants.
Nouvelles extensions GCC et Clang
Ils ont amélioré la compatibilité avec les extensions spécifiques aux compilateurs en ajoutant la prise en charge des éléments suivants :
Fonctions imbriquées : CLion prend désormais en charge l'extension GCC permettant de définir des fonctions à l'intérieur d'autres fonctions dans le code C, ce qui est utile lorsque vous travaillez avec des bases de code héritées ou des projets embarqués qui s'appuient sur ce modèle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 int main(void) { int outer_var = 10; // Define the nested function void nested_function() { printf("Inside nested function\n"); printf("Accessing outer variable: %d\n", outer_var); } // Call the nested function nested_function(); return 0; }
Qualificateurs _Nullable et _Nonnull : les qualificateurs de nullabilité des pointeurs de Clang indiquent si un pointeur peut être nul ou non. L'analyseur syntaxique reconnaît désormais ces qualificateurs, de sorte que le code partagé avec les plateformes Apple ou utilisant des API spécifiques à Clang ne génère plus d'avertissements de faux positifs ni d'inspections incorrectes.
Conditionnelles avec opérandes omis : la syntaxe abrégée x ?: y, où l'opérande du milieu est omis, est particulièrement utile dans les bases de code GNU C, car elle fournit une valeur de secours sans répéter la condition.
Syntaxe de plage d'initialisation désignée : cette extension GCC vous permet d'initialiser une plage d'éléments de tableau à la même valeur en une seule expression, comme int arr[100] = { [0 ... 49] = 0, [50 ... 99] = 1 };. Cette syntaxe est pratique dans le développement embarqué et système pour initialiser des cartes de registres matériels, des tables de correspondance ou des tampons d'E/S mappés en mémoire qui nécessitent que les tableaux aient des valeurs par défaut prévisibles.
Nouvelles fonctionnalités d'assistance au codage et de refactorisation
Les capacités d'assistance au codage et de refactorisation de CLion ont bénéficié de plusieurs améliorations visant à réduire le nettoyage manuel et les tâches répétitives. Celles-ci comprennent des importations de modules plus intelligentes, de nouvelles inspections qui détectent rapidement les erreurs courantes, la prise en charge de la refactorisation dans les blocs de code inactifs et le tri automatique des définitions.
Importation automatique pour les modules C++20
Lorsque vous utilisez un symbole exporté mais que la déclaration import correspondante est manquante, CLion vous propose de l'insérer automatiquement à l'aide d'un raccourci (Alt + Entrée sous Windows et Linux ou ⌥↩ sous macOS).
Notez qu'actuellement, l'importation automatique pour les modules C++20 fonctionne pour les symboles exportés directement depuis les unités d'interface du module principal et les partitions de module.
Nouvelles inspections
Ils ont également ajouté plusieurs nouvelles inspections intégrées qui vous aident à garder votre code plus propre et plus lisible. En voici quelques exemples :
- CLion détecte désormais automatiquement les déclarations anticipées en double, les met en surbrillance en gris et propose une correction rapide pour les supprimer, vous évitant ainsi de les rechercher manuellement. Vous pouvez également effectuer cette opération à l’aide d’un raccourci (Alt+Entrée sous Windows et Linux ou ⌥↩ sur macOS).
- Si votre projet cible C++20 ou une version ultérieure et contient le mot-clé typename dans des contextes où il n'est plus requis, CLion identifie ces cas et propose une correction rapide pour les supprimer.
- L'EDI détecte désormais les cas où les initialiseurs désignés C++20 sont dans le mauvais ordre par rapport à leurs déclarations au sein de la structure. CLion met en évidence le problème directement dans l'éditeur, ce qui vous permet de le voir immédiatement plutôt qu'après la compilation.
- Une autre nouvelle inspection vous avertit lorsqu'une fonction a un niveau d'accès différent de celui de la fonction virtuelle qu'elle redéfinit dans la classe de base. Par exemple, une fonction virtuelle publique dans la classe de base peut être redéfinie comme privée dans la classe dérivée. CLion vous aide à détecter ces incohérences d'accès, qui sont souvent involontaires mais autorisées par les compilateurs.
Amélioration de l'assistance au codage et des refactorisations dans le code inactif
L'analyse de code, la complétion de code et les refactorisations locales sont désormais pleinement disponibles à l'intérieur des blocs de préprocesseur inactifs, ce qui vous permet de modifier du code spécifique à une plateforme sans changer de configuration de build.
Tri automatique des définitions
CLion peut désormais trier automatiquement les définitions de fonctions dans un fichier source afin qu'elles correspondent à l'ordre des déclarations dans le fichier d'en-tête correspondant. Pour une correction ponctuelle, utilisez l'action contextuelle Trier les définitions par ordre de déclaration afin de réorganiser les définitions d'une seule fonction, d'un fichier entier ou de l'ensemble du projet. Pour une surveillance continue, activez l'option de style correspondante dans Paramètres | Éditeur | Style de code | C/C++ | Style de syntaxe. CLion signalera alors toute incohérence par une inspection, et vous pourrez les corriger automatiquement d'un simple clic.
Possibilité de modifier les règles de nommage
CLion propose désormais une nouvelle boîte de dialogue Modifier la règle de nommage dans le cadre des efforts visant à améliorer la prise en charge des règles de nommage C/C++. Pour accéder à cette boîte de dialogue, accédez à Paramètres | Éditeur | Style de code | C/C++ | Nommage, puis sélectionnez une règle et cliquez sur Modifier, ou double-cliquez simplement dessus.
Chaque règle de nommage autorise un ou plusieurs styles, et pour chaque style, vous pouvez configurer le modèle de nommage de base, le préfixe et le suffixe, et bien plus encore.
L'équipe de CLion conclut sa présentation : « Les améliorations présentées dans cet article sont rendues possibles par CLion Nova, le moteur C++ personnalisé de CLion. Un grand merci à l'équipe C++ Core pour son développement ! Nous continuerons à mettre en avant les mises à jour les plus intéressantes du moteur de langage dans nos prochains articles sur les versions à venir – d'autres suivront. »
Télécharger CLion
Demander une démo de CLion

















Partager