La question est: Pourriez-vous s'il vous plaît m'aider à mieux comprendre la macro RAII en langage C (pas C++) en utilisant uniquement les ressources que je fournis au bas de cette question? J'essaie de l'analyser dans mon esprit afin de comprendre ce qu'il dit et comment cela a du sens (cela n'a pas de sens dans mon esprit). La syntaxe est difficile. L'objectif de la question est: j'ai du mal à lire et à comprendre la syntaxe bizarre et sa mise en œuvre en langage C. Par exemple, je peux facilement lire, comprendre et analyser (il est logique pour moi) la macro swap suivante:L'acquisition des ressources est l'initialisation en langage C
#define myswap(type,A,B) {type _z; _z = (A); (A) = (B); (B) = _z;}
(le passage suivant est soulevé du livre: Comprendre les pointeurs C)
En langage C, le compilateur GNU fournit une extension non standard à support RAII.
L'extension GNU utilise une macro appelée RAII_VARIABLE. Il déclare une variable et associés à la variable:
- Un type
- Une fonction à exécuter lorsque la variable est créée
Une fonction à exécuter lorsque la variable est hors de portée
La macro est illustré ci-dessous:
#define RAII_VARIABLE(vartype,varname,initval,dtor) \ void _dtor_ ## varname (vartype * v) { dtor(*v); } \ vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)
Exemple:
void raiiExample() { RAII_VARIABLE(char*, name, (char*)malloc(32), free); strcpy(name,"RAII Example"); printf("%s\n",name); } int main(void){ raiiExample(); }
Lorsque cette fonction est exécutée, la chaîne « RAII_Example » sera affiché. Des résultats similaires peuvent être obtenus sans utiliser l'extension GNU.
Je n'aime pas cette méthode, cela ne ressemble pas C. – Stargateur
Pourquoi utiliser cette macro au lieu de ... en utilisant C++? –
L'objectif de la question est: Pourriez-vous s'il vous plaît m'aider à mieux comprendre la macro RAII en langage C? Je suis aux prises avec la syntaxe et la façon dont elle est implémentée dans Clang. Je sais ce qu'il fait (alloue et libère la mémoire .....). :) – Mynicks