L'extension de mot clé __declspec

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Support du langage pour les bibliothèques Appmethod (C++)


Certains arguments de l'extension de mot clé __declspec permettent le support des bibliothèques. Ces arguments sont listés ci-dessous. Les macros pour les arguments de declspec et leurs combinaisons sont définies dans sysmac.h. Dans la plupart des cas, vous n'avez pas besoin de spécifier ces arguments. Quand vous avez besoin de les ajouter, vous devez utiliser les macros.

__declspec(delphiclass)

L'argument delphiclass est utilisé pour les déclarations des classes dérivées de TObject. Ces classes sont créées avec les compatibilités suivantes :

  • RTTI compatible Pascal Objet
  • Comportement du constructeur / destructeur compatible avec les bibliothèques
  • Gestion des exceptions compatible avec les bibliothèques

Une classe compatible avec les bibliothèques a les restrictions suivantes :

  • Les classes de base virtuelles sont interdites.
  • Pas d'héritage multiple sauf pour le cas décrit dans Héritage et interfaces.
  • Doit être allouée dynamiquement en utilisant l’opérateur global new.

    Remarque : Dans le cas d'une instance allouée statiquement (par exemple, comme une variable locale), le compilateur ignore simplement la directive declspec, sans aucun avertissement.

  • Doit avoir un destructeur.
  • Les constructeurs de copie et les opérateurs d'affectation ne sont pas générés par le compilateur pour les classes dérivées des bibliothèques.
  • Une déclaration de classe traduite depuis le Pascal Objet a besoin de ce modificateur si le compilateur doit savoir que la classe est dérivée de TObject.

__declspec(delphirecord)

L'attribut de classe de stockage delphirecord est utilisé lors de la conversion d'enregistrements Object Pascal en classes/structures C++ dans les en-têtes .hpp (en utilisant le compilateur Object Pascal). Dans Object Pascal, une convention concernant les enregistrements à renvoyer depuis les fonctions spécifie qu'une fonction renvoyant un enregistrement renvoie un paramètre caché pointant sur l'enregistrement à renvoyer. Object Pascal renvoie un pointeur sur un emplacement qui est initialisé à zéro, tandis que C++ n'offre pas une telle garantie. Par souci de conformité, quand C++ trouve une structure qui est renvoyée depuis une fonction et est marquée par __declspec(delphirecord), il initialise à zéro l'emplacement mémoire.

__declspec(delphireturn)

L'argument delphireturn est utilisé en interne seulement par les bibliothèques dans Appmethod C++. Il est utilisé pour les déclarations des classes créées dans Appmethod C++ pour supporter les types de données intégrés et les constructions de langage Pascal Objet n'ayant pas d'équivalent dans un type C++ natif. Ce sont, entre autres, Currency, UnicodeString, AnsiString, Variant, TDateTime et Set. L'argument delphireturn marque les classes C++ comme compatibles avec les bibliothèques pour la gestion des appels de fonctions en tant que paramètres et les valeurs de retour. Ce modificateur est nécessaire pour transmettre une structure par valeur à une fonction entre Pascal Objet et C++.


__declspec(delphirtti)

L'argument delphirtti oblige le compilateur à inclure des informations de type à l'exécution dans une classe lors de sa compilation. Quand ce modificateur est utilisé, le compilateur génère des informations de type à l'exécution pour tous les champs, méthodes, et propriétés déclarés dans une section published. Pour les interfaces, le compilateur génère des informations de type à l'exécution pour toutes les méthodes de l'interface. Si une classe est compilée avec des informations de type à l'exécution, tous ses descendants incluent aussi des informations de type à l'exécution. Comme la classe TPersistent est compilée avec des informations de type à l'exécution, cela signifie qu'il n'est pas nécessaire d'utiliser ce modificateur avec toutes les classes que vous créez ayant TPersistent comme ancêtre. Ce modificateur est surtout utilisé pour les interfaces dans des applications qui implémentent ou utilisent des services Web.

__declspec(dynamic)

L’argument dynamic est utilisé pour la déclaration des fonctions dynamiques. Les fonctions dynamiques sont similaires aux fonctions virtuelles, à l'exception qu'elles sont stockées seulement dans les vtables des objets qui les définissent, et pas dans les vtables des descendants. Si vous appelez une fonction dynamique alors que cette fonction n'est pas définie dans votre objet, les vtables de ses ancêtres sont examinés jusqu’à trouver la fonction. Les fonctions dynamiques sont seulement valides pour les classes dérivées de TObject.

__declspec(hidesbase)

L'argument hidesbase préserve la sémantique d'un programme Pascal Objet lors du portage de fonctions virtuelles ou redéfinies vers Appmethod C++. En Pascal Objet, les fonctions virtuelles des classes de base peuvent apparaître dans la classe dérivée comme une fonction de même nom, mais conçue comme une fonction entièrement nouvelle sans relation explicite avec la précédente.

Les compilateurs utilisent la macro HIDESBASE, définie dans sysmac.h, pour spécifier que ces types de déclarations de fonctions sont entièrement distincts. Par exemple, si une classe de base, T1, déclare une fonction virtuelle, func, sans arguments et si sa classe dérivée, T2, a déclaré une fonction de même nom et de même signature, le compilateur Object Pascal produit un fichier HPP contenant le prototype suivant :

    virtual void T1::func(void) ;
    HIDESBASE void T2::func(void) ;

Sans la déclaration HIDESBASE, la sémantique du programme C++ indique que la fonction virtuelle T1::func() est redéfinie par T2::func().

__declspec(package)

L'argument package indique que le code définissant la classe peut être compilé dans un package. Ce modificateur est généré automatiquement par le compilateur lors de la création de packages dans l'EDI.

__declspec(pascalimplementation)

L'argument pascalimplementation indique que le code définissant la classe a été implémenté en Pascal Objet. Ce modificateur apparaît dans le fichier d'en-tête de portabilité Pascal Objet avec une extension .hpp.


__declspec(uuid)

L'argument uuid associe une classe à un GUID (Globally Unique IDentifier). Il peut s'utiliser dans toute classe, mais il s'emploie typiquement avec des classes qui représentent des interfaces Pascal Objet (ou des interfaces COM). Vous pouvez récupérer le GUID d'une classe déclarée en utilisant ce modificateur, en appelant la directive __uuidof.

Voir aussi