1
votes

appel de fonction d'encapsulation de macro avec les arguments par défaut

J'ai une fonction d'allocation de mémoire, qui a un argument par défaut pour l'alignement ...

void* _symalloc(int numbytes, int alignment, const char* file, int line);
#define symalloc(numbytes, alignment) _symalloc(numbytes, alignment, __FILE__, __LINE)

Je veux obtenir les numéros de fichier / ligne transmis à partir de l'emplacement de l'appel. Donc, je l'ai changé en ceci ...

void* symalloc(int numbytes, int alignment=32)

Mais maintenant, le problème est que tous les appelants qui ne passaient pas dans l'alignement sont cassés, et il y en a des centaines.

Y a-t-il un moyen d'avoir ce support soit en passant l'alignement ou non, et de fournir le fichier / ligne dans les deux cas?


3 commentaires

Les identifiants commençant par un trait de soulignement sont réservés dans l'espace de noms global * dub di dub *


Pouvez-vous fournir des arguments par défaut pour votre wrapper?


Comment fournir des arguments par défaut à une macro? Si je fais en sorte que tous les arguments de _symalloc aient des arguments par défaut, la macro est toujours écrite pour prendre 2 arguments et non 1.


3 Réponses :


0
votes

Vous devez également définir des paramètres par défaut pour ces autres valeurs, donc peu importe que certains sites d'appel ne les aient pas:

void* _symalloc(int numbytes, int alignment = 32, const char* file = NULL, int line = 0);


1 commentaires

Cela n'aide pas le code existant comme void * p = symalloc (sizeof (Thing));



2
votes

Utilisez une macro variadique et __VA_ARGS__ (C ++ 11 et plus tard, et souvent pris en charge par les compilateurs précédents aussi):

void symalloc_(const char* file, int line, int numbytes, int alignment=32);
#define symalloc(...) (symalloc(__FILE__, __LINE__, __VA_ARGS__))

Notez le réarrangement des paramètres afin que l'argument par défaut est sur le dernier.


0 commentaires