web-dev-qa-db-fra.com

Modules C ++ - pourquoi ont-ils été supprimés de C ++ 0x? Seront-ils de retour plus tard?

Je viens de découvrir ce ancien projet C++ 0x sur les modules en C++ 0x.

L'idée était de sortir du système .h/.cpp actuel en écrivant uniquement des fichiers .cpp qui généreraient alors des fichiers de module lors de la compilation, qui seraient ensuite à leur tour utilisés par les autres fichiers .cpp.

Cela ressemble à une fonctionnalité vraiment géniale.

Mais ma question est: pourquoi l'ont-ils supprimé de C++ 0x? Est-ce à cause de trop de difficultés techniques? Manque de temps? Et pensez-vous qu'ils envisageront de travailler dessus pour une version ultérieure de C++?

110
Tomaka17

D'après State of C++ Evolution (Post San Francisco 2008) , la proposition de modules a été classée comme "En-tête pour un TR distinct:"

Ces sujets sont jugés trop importants pour attendre une autre norme après C++ 0x avant d'être publiés, mais trop expérimentaux pour être finalisés à temps pour la prochaine norme. Par conséquent, ces fonctionnalités seront fournies par un rapport technique dans les meilleurs délais.

La proposition de modules n'était tout simplement pas prête et l'attendre aurait retardé la fin de la norme C++ 0x. Il n'a pas été vraiment supprimé, il n'a tout simplement jamais été incorporé dans le document de travail.

69
James McNellis

Projet de modules C++ (spécification technique après C++ 17)

Un projet et plusieurs révisions mises à jour pour la spécification du module C/C++ ont été publiés par WG21 sur open-std.org. Je ne lierai ici que les derniers documents:

  • Projet de travail, extensions à C++ pour les modules N461 (octobre 2016).
  • Quatrième révision publiée comme P0142R (mars 2016).
  • Libellé des modules publié sous la forme P0143R2 (mars 2016).
  • L'équipe de clang a publié une deuxième révision de leurs modifications: P0273R1 (octobre 2016).

Les articles de blog suivants contiennent un résumé des réunions sur les normes et en particulier un résumé de l'état actuel du projet de modules:

Mise à jour: Comme expliqué dans le rapport de voyage de Kona que j'ai lié à ci-dessus, il y a actuellement deux propositions concurrentes, une de Microsoft et une de Clang. La solution proposée par Microsoft ne permet pas d'exporter des macros, tandis que la solution de l'équipe Clang prendrait en charge l'exportation de macros. Jusqu'à présent, seul Microsoft a officiellement soumis un projet de spécification de module.

Spécification du module telle que proposée par Microsoft

Voici un bref aperçu des concepts les plus importants que contient cette proposition. Comme c'est un projet, cela pourrait encore changer. Le nouveau standard de modules comprendra entre autres:

Un mot clé module pour déclarer un module, plusieurs fichiers peuvent le déclarer pour construire un module (mais pour chaque module un seul compilation-unit peut contenir un export {} section):

module M;

Un mot clé import pour importer des modules, au lieu de import, il peut également être décidé d'utiliser using module à la place, donc un nouveau mot clé d'importation pourrait être évité.

import std.io;
import module.submodule;

Une syntaxe export, qui définit le public déclarations qui fait partie de ce module, non-interface déclarations qui ne doit pas être exporté en tant que partie du module sera défini en dehors du bloc d'exportation. Déclarations peut être 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 locales aux modules et ne seront pas exportées. Ainsi, les macros n'ont aucun impact sur les modules importés:

#define FILE "my/file"
import std.io;   //will not be impacted by the above definition

Il est important de noter que le système et les modules du préprocesseur actuel pourront coexister et que les en-têtes peuvent 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 de 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 qu'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'y a pas de syntaxe C ou C++ pour les déclarations d'importation. Clang suivra la proposition de modules au sein du comité C++. Consultez la section Comprend en tant qu'importations pour voir comment les modules sont importés aujourd'hui.

La partie principale actuellement implémentée par Clang est le "Module Map Language" qui permet d'écrire des mappes de modules pour le code existant qui utilise toujours des fichiers d'en-tête.

Exportations de macros à partir de modules

Comme mentionné ci-dessus, il n'est pas encore clair si les exportations de macro feront partie de la finale Modules TS. Dans P0273R1 la syntaxe suivante a été proposée pour l'exportation de macros:

#export define MAX(A,B) ((A) > (B)) ? (A) : (B);
89
lanoxx

Clang est le premier compilateur à commencer à travailler sur des modules avant même que la normalisation ne soit terminée. Il n'y a pas encore beaucoup de documentation, mais un exemple de code peut être trouvé ici:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/

Quelques commentaires de Douglas Gregor (le développeur les implémentant):
http://clang-developers.42468.n3.nabble.com/C-modules-td3619936.html

En théorie, vous pouvez définir un tas de macros d'assistance comme begin_module, end_module, import_module pour vous protéger contre toute modification probable de la syntaxe qui viendra à l'avenir.

EDIT 1:
Douglas Gregor a publié une présentation sur sa mise en œuvre:
http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit

EDIT 2:
Le support du module dans clang a été documenté ici:
http://clang.llvm.org/docs/Modules.html

EDIT 3:
Les modules sont désormais également pris en charge dans le compilateur C++ de Microsoft: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs- 2015-update-1.aspx

32
zah