Maison > développement back-end > Golang > le corps du texte

Déclaration directe des types de fonctions en C

王林
Libérer: 2024-02-08 22:00:12
avant
829 Les gens l'ont consulté

C 中函数类型的前向声明

L'éditeur PHP Zimo vous présente la déclaration directe des types de fonctions en langage C. En langage C, la déclaration directe d'un type de fonction est un moyen de déclarer une fonction sans la définir. Avec les déclarations avancées, nous permettons au compilateur de reconnaître et d'utiliser ces fonctions dans le code ultérieur sans avoir à les définir à l'avance. Ceci est très utile pour résoudre le problème des fonctions qui s'appellent entre elles, en particulier lors de l'écriture de programmes volumineux. En utilisant des déclarations directes de types de fonctions, nous pouvons améliorer la lisibilité et la maintenabilité du code et rendre le code plus modulaire et structuré. Examinons de plus près cette fonctionnalité importante du langage C.

Contenu de la question

Je souhaite déclarer un type de fonction récursive (déclarant une fonction d'elle-même) en C.

Avec un langage comme Go, je peux faire :

<code>type F func() F

func foo() F {
  return foo
}
</code>
Copier après la connexion

Si j'essaye de faire la même chose en C :

typedef (*F)(F());
Copier après la connexion

Je reçois l'erreur suivante de GCC :

main.c:1:14: error: unknown type name ‘F’
    1 | typedef (*F)(F());
Copier après la connexion

Cela a du sens puisque F n'existe pas lorsqu'il est utilisé. La déclaration directe peut résoudre ce problème, comment déclarer le type de fonction en avant en C ?

Solution

C ne prend pas en charge les définitions de types récursifs.

Exception : vous pouvez utiliser un pointeur vers un type de structure qui n'a pas encore été déclaré, afin que le type de structure puisse contenir un pointeur vers une structure du type de structure en cours de déclaration.

De plus, vous pouvez apparemment utiliser un type struct non déclaré comme valeur de retour d'une fonction. C'est donc proche de ce que vous souhaitez :

// This effectively gives us
// typedef struct { F *f } F( void );

typedef struct S S;

typedef S F( void );

struct S {
   F *f;
};

S foo() {
   return (S){ foo };
}

int main( void ) {
   F *f = foo;
   printf( "%p\n", (void*)f );

   f = f().f;
   printf( "%p\n", (void*)f );
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!