11 votes

Convention d'appellation des constructeurs et des destructeurs en C

Supposons que je dispose d'un struct list et je veux fournir une fonction "constructor" et une fonction "destructor". Comment dois-je les nommer respectivement ?

void list__init(struct list * self);
void list__construct(struct list * self);
void list__create(struct list * self);
...

void list__done(struct list * self);
void list__destruct(struct list * self);
void list__destroy(struct list * self);
...

Existe-t-il une convention de dénomination prédominante dans le monde réel ?

11voto

apmasell Points 3156

Les gens de GLib/GTK ont créé la convention d'utiliser _new y _free pour les constructeurs et destructeurs d'allocation de mémoire et _init y _destroy pour les constructeurs et les destructeurs n'allouant pas de mémoire.

La bibliothèque pthread semble suivre la convention suivante _init y _destroy pour ceux qui n'allouent pas de mémoire et _create pour l'allocation de la mémoire.

X11 utilise XOpenFoo y XCloseFoo .

La bibliothèque C elle-même utilise free est utilisé pour les nettoyages sans allocation de mémoire de structures telles que glob_t y wordexp_t .

Je pense donc que la réponse est non, mais il y a certainement de grands groupes de personnes qui ont choisi des notations particulières dans certains projets.

10voto

Il n'existe pas de convention généralement acceptée.

Le C++ a bien sûr influencé l'opinion des gens dans ce domaine.

Personnellement, j'utilise new() lorsque la fonction effectue une allocation de mémoire, init() dans le cas contraire, delete() en cas de désallocation et cleanup() dans le cas contraire.

4voto

Christoph Points 64389

J'utilise la convention suivante :

  • l'allocation de mémoire par l'intermédiaire de ..._alloc()
  • l'initialisation par l'intermédiaire de ..._init()
  • l'allocation et l'initialisation combinées via ..._create()
  • libération des ressources associées via ..._discard()
  • libération de la mémoire via ..._dealloc() o ..._free()
  • libération combinée des ressources et de la mémoire via ..._destroy()

3voto

Steve Jessop Points 166970

J'ai travaillé dans une entreprise qui utilisait init / deinit en standard, ce qui semble correct. Je pense avoir vu init / fini de plus d'une source, ce qui, pour autant que je sache, est une astuce pour que les noms aient la même longueur.

pthread_mutex_init / pthread_mutex_destroy (initialisation sur place)

sem_create / sem_destroy (renvoie un nouveau handle, mais observez que Posix ne ressent pas le besoin de discriminer entre un "destroy" qui libère le handle et un "destroy" qui le détruit sur place)

mpz_init / mpz_clear (initialisation sur place)

Vous pouvez donc probablement faire ce que vous voulez, et personne ne peut raisonnablement se plaindre que vous ignorez une "norme".

0voto

Phonon Points 6751

Selon qu'il s'agit d'un "objet" ou d'un "module actif", je procède généralement comme suit

Objet :

INIT <----> TERMINATE

Module actif :

INIT ---------> START 
 ^                ^
 |                |    
 |                v 
TERMINATE <----- STOP

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X