12
votes

Compréhensionc typef

J'essaie de comprendre ce code qui provient de Documentation TCL

typedef int Tcl_DriverOutputProc(
        ClientData instanceData,
        const char *buf,
        int toWrite,
        int *errorCodePtr);


2 commentaires

Il est utilisé pour déclarer pointeurs de fonction dans TCL_CHANNELTYPE


Que pensez-vous de cela (typef int (* bonjour) (vide);)?


3 Réponses :


16
votes

Je sais que le but de TLECDEF est d'attribuer des noms alternatifs aux types existants

exactement. Les fonctions ont des types, ce qui attribue le nom TCL_DRIVEROutUtProc à ce type de fonction. Le type de fonction elle-même est écrit comme une fonction avec le nom manquant: xxx

et, comme avec une déclaration de fonction, vous pouvez inclure des noms pour les paramètres ou les laisser sortir, Comme vous le souhaitez.

Comment cela peut être utilisé?

Vous pouvez utiliser des pointeurs vers des fonctions afin de spécifier le comportement au moment de l'exécution; Par exemple: xxx

Dans ce cas, il vous permet d'écrire une fonction pour gérer certains aspects de la sortie TCL et dire à TCL d'utiliser cette fonction. < / blockquote>


4 commentaires

Wow, je ne savais pas que vous pourriez créer un type TYPEF pour un type de fonction réelle (contrairement au pointeur commun Typedef) dans C . Mais je suppose que le seul cas d'utilisation possible dans C est en effet de créer des variables de pointeur (et donc la voie habituelle est de tapercer le type de pointeur en premier lieu). Mais toujours agréable de savoir.


@Christianrau: Vous pouvez également utiliser une fonction TypeDef pour déclarer une fonction, bien que vous ayez toujours besoin de la syntaxe de déclaration de fonction normale lorsque vous le définissez; et dans les types de fonctions C ++ sont souvent utilisés comme arguments de modèle (E.G. std :: Fonction ).


Ouais, à la fin C ++ fait beaucoup plus d'utilisation de Types du tout, que ce soit surcharger, des modèles, ... et je pensais que ce Type de fonction Syntaxe était un novum de C ++ 11 , introduit avec des choses comme std :: résultat_of et std :: fonction gérer. Toujours certaines choses à apprendre sur le bon vieux C aujourd'hui;)


Interne, TCL utilise la fonction Typefs à la fois pour les deux fins: fournissant des points de plug-in dans "les descriptions de classe" (s'il était écrit en C ++, il utiliserait des classes et il y a des endroits où il n'y a pas de structure intervenante parce que cela Il suffit d'avoir un membre) et d'appliquer la restriction que des fonctions qui seront utilisées dans ces structures ont la déclaration correcte. Compte tenu de la taille de la base de code TCL, en faisant prudemment que cela a beaucoup de sens (et donne les meilleurs messages d'erreur quand on gâche).



0
votes

La syntaxe de Typefefs pour les types de fonctions est Wierd - le nom de type que vous créez apparaît dans le centre fort . Comme Mike Seymour l'a déjà dit, cela attribue le nom TCL_DRIVEROutUtProc au type de fonction int (clientData, const char *, int, int *) . .


1 commentaires

Eh bien, étrange ... Il apparaît exactement au même endroit où le nom de la fonction apparaît dans une déclaration non-Typedef.



3
votes

TYPEDEF peut également être utilisé pour déclarer une fonction dire "Function_Name" et ce "nom_cund_nom" peut être utilisé pour déclarer une autre fonction de type et de paramètres similaires.

typedef struct Tcl_ChannelType {
    const char *typeName;
     Tcl_ChannelTypeVersion version;
    Tcl_  DriverCloseProc *closeProc;
    Tcl_DriverInputProc *inputProc;
    Tcl_DriverOutputProc *outputProc;   // <-- DriverOutputproc is used here.
    Tcl_DriverSeekProc *seekProc;
    Tcl_DriverSetOptionProc *setOptionProc;
    Tcl_DriverGetOptionProc *getOptionProc;
    Tcl_DriverWatchProc *watchProc;
    Tcl_DriverGetHandleProc *getHandleProc;
    Tcl_DriverClose2Proc *close2Proc;
    Tcl_DriverBlockModeProc *blockModeProc;
    Tcl_DriverFlushProc *flushProc;
    Tcl_DriverHandlerProc *handlerProc;
    Tcl_DriverTruncateProc *truncateProc;
}Tcl_ChannelType;


0 commentaires