L'extension de mot clé __declspec

De RAD Studio
Aller à : navigation, rechercher

Remonter à Gestion des types de données et des concepts du langage Delphi


Certains arguments de l'extension de mot clé __declspec permettent la prise en charge 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 Object Pascal
  • 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 à partir de Object Pascal 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 Delphi en classes/structures C++ dans les en-têtes .hpp (en utilisant le compilateur Delphi   dcc32 -JPHNE <nomfichier.pas>). Dans Delphi, 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. Delphi renvoie un pointeur sur un emplacement qui est initialisé à zéro, tandis que C++ n'offre pas de 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 usage interne uniquement par les bibliothèques dans C++Builder. Il est utilisé pour les déclarations des classes créées dans C++Builder.pour prendre en charge les types de données intégrés et les constructions de langage Object Pascal 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 fonction en tant que paramètres et des valeurs de retour. Ce modificateur est nécessaire pour transmettre une structure par valeur à une fonction entre Object Pascal et C++.

__declspec(delphirtti)

L'argument delphirtti oblige le compilateur à inclure des informations de type à l'exécution (RTTI) 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 les déclarations 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'à ce que la fonction soit trouvée. 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 Object Pascal lors du portage de fonctions virtuelles ou redéfinies vers C++Builder. En Object Pascal, 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 Delphi DCC32 - jphn 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 Object Pascal. Ce modificateur apparaît dans le fichier d'en-tête de portabilité Object Pascal 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 Object Pascal (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