2010-05-22 11 views
4

Je lis le code source de allocateur mémoire Hoard, et dans le fichier de gnuwrapper.cpp, il y a le code suivantmacros A dans le langage C (#define)

#define CUSTOM_MALLOC(x)  CUSTOM_PREFIX(malloc)(x) 

Quel est le sens de CUSTOM_PREFIX(malloc)(x)? est CUSTOM_PREFIX une fonction? Mais en tant que fonction, elle n'a été définie nulle part. Si c'est variable, alors comment pouvons-nous utiliser une variable comme var(malloc)(x)?

Code Plus:

#ifndef __GNUC__ 
#error "This file requires the GNU compiler." 
#endif 

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <malloc.h> 


#ifndef CUSTOM_PREFIX ==> here looks like it's a variable, so if it doesn't define, then define here. 
#define CUSTOM_PREFIX 
#endif 

#define CUSTOM_MALLOC(x)  CUSTOM_PREFIX(malloc)(x) ===> what's the meaning of this? 
#define CUSTOM_FREE(x)  CUSTOM_PREFIX(free)(x) 
#define CUSTOM_REALLOC(x,y) CUSTOM_PREFIX(realloc)(x,y) 
#define CUSTOM_MEMALIGN(x,y) CUSTOM_PREFIX(memalign)(x,y) 
+0

Les chevrons apparaîtront très bien dans le code et le texte si vous formatez le code avec le bouton 1010 au-dessus de la zone d'entrée de texte. –

+0

merci beaucoup pour Neil. stackoverflow est tellement cool, beaucoup de gens sont prêts à aider les autres, c'est incroyable que ma question ait reçu une réponse en quelques minutes. – Daniel

Répondre

6

Dans votre code, puisque CUSTOM_PREFIX est défini comme rien, la chaîne CUSTOM_PREFIX(malloc)(x) élargira à

(malloc)(x) 

qui est équivalent à l'habituel

malloc(x) 

Cependant, le CUSTOM_PREFIX permet au développeur de choisir un diff fonction de gestion de la mémoire erent. Par exemple, si nous définissons

#define CUSTOM_PREFIX(f) my_##f 

alors CUSTOM_PREFIX(malloc)(x) sera étendu à

my_malloc(x) 
+3

en fait, '(malloc) (x)' n'est pas équivalent à 'malloc (x)': le premier est garanti comme un appel de fonction, alors que le second peut être un appel de macro (voir C99 7.1.4 §5 pour un exemple montrant les différentes manières d'invoquer des fonctions standard de lib) – Christoph

0

CUSTOM_PREFIX est défini comme rien, il va tout simplement disparaître, laissant derrière (malloc)(x), qui est le même que malloc(x). Pourquoi? Je ne sais pas. Peut-être d'autres endroits dans le code CUSTOM_PREFIX mis à autre chose.

0

A une supposition, son une macro qui change les appels à malloc (x) etc. en quelque chose comme:

DEBUG_malloc(x); 

Vous pouvez choisir de fournir la macro vous, de fournir un préfixe personnalisé pour les fonctions, ou non, auquel cas les noms ne seront pas changés.