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 Réponses :
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);
Cela n'aide pas le code existant comme void * p = symalloc (sizeof (Thing));
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.
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.