Brouillon des modules C++ (Spécification technique après C++17)
Un brouillon et plusieurs révisions mises à jour pour la spécification des modules C/C++ ont été publiés par WG21 sur open-std.org. Je ne lierai ici que les documents les plus récents :
- Projet de travail, Extensions C++ pour les modules N4610 (octobre 2016).
- Quatrième révision publiée sous le nom de P0142R0 (mars 2016).
- Formulation pour les modules publiée sous le nom de P0143R2 (mars 2016).
- L'équipe de clang a publié une deuxième révision de leurs modifications : P0273R1 (octobre 2016).
Les publications de blog suivantes contiennent un résumé des réunions sur les normes et en particulier un résumé de l'état actuel du projet des modules :
Mise à jour : Comme expliqué dans le compte rendu de voyage de Kona que j'ai lié ci-dessus, il existe actuellement deux propositions concurrentes, une de la part de Microsoft et une de la part de Clang. La solution proposée par Microsoft ne permet pas d'exporter les macros, tandis que la solution de l'équipe de Clang supporterait l'exportation des macros. Jusqu'à présent, seul Microsoft a formellement soumis un projet de spécification de module.
Spécification du module proposée par Microsoft
Voici un bref aperçu des concepts les plus importants contenus dans cette proposition. Comme il s'agit d'un projet, cela pourrait encore changer. La nouvelle norme des modules comportera, entre autres, les éléments suivants :
Un mot-clé module
pour déclarer un module, plusieurs fichiers peuvent déclarer cela pour construire un module (mais pour chaque module, une seule unité de compilation peut contenir une section export {}
) :
module M;
Un mot-clé import
pour importer des modules, au lieu de import
il pourrait également être décidé d'utiliser using module
à la place, de sorte qu'un nouveau mot-clé d'importation pourrait être évité.
import std.io;
import module.submodule;
Une syntaxe export
, qui définit les déclarations publiques qui font partie de ce module, les déclarations non-interface qui ne doivent pas être exportées en tant que partie du module seront définies en dehors du bloc d'exportation. Les déclarations peuvent être de n'importe quel type de déclaration en C/C++, c'est-à-dire non seulement des fonctions mais aussi des variables, des structures, des modèles, des espaces de noms et des classes :
export {
int f(int);
double g(double, int);
int foo;
namespace Calc {
int add(int a, int b);
}
}
void not_exported_function(char* foo);
Un changement important des modules sera que les macros et les définitions de préprocesseur seront localisés dans les modules et ne seront pas exportés. Ainsi, les macros n'auront aucun impact sur les modules importés :
#define FILE "my/file"
import std.io; //ne sera pas impacté par la définition ci-dessus
Il est important de noter que le système de préprocesseur actuel et les modules pourront coexister et que les en-têtes pourront toujours être utilisés, par exemple pour inclure des macros.
Pour des informations plus détaillées, je suggère de lire le projet.
Modules Clang
Clang a travaillé sur une implémentation des modules qui peut être trouvée sur la page des modules de Clang. Cependant, Clang n'implémente actuellement pas de syntaxe concrète pour les modules, c'est-à-dire que aucune des syntaxes mentionnées ci-dessus n'a été implémentée par Clang. Pour expliquer cela, la page contient la déclaration suivante :
Actuellement, il n'existe pas de syntaxe C ou C++ pour les déclarations d'importation. Clang suivra la proposition des modules dans le comité C++. Consultez la section Inclusions en tant qu'importations pour voir comment les modules sont importés aujourd'hui.
La partie principale qui est actuellement implémentée par Clang est le "langage de carte de modules" qui permet d'écrire des cartes de modules pour le code existant qui utilise encore des fichiers d'en-tête.
Exportations de macros des modules
Comme mentionné ci-dessus, il n'est pas encore clair si les exportations de macros feront partie de la version finale des Modules TS. Dans P0273R1, la syntaxe suivante a été proposée pour l'exportation des macros :
#export define MAX(A,B) ((A) > (B)) ? (A) : (B);