Équivalent ISO C des groupes contreventés au sein d’expressions

Comment puis-je effectuer les opérations suivantes de manière conforme (ISO C99)?

#define MALLOC(type, length, message) ({ \ type * a_##__LINE__ = (type *)malloc((length) * sizeof(type)); \ assert(message && (a_##__LINE__ != NULL)); \ a_##__LINE__; \ }) double **masortingx = MALLOC(double *, height, "Failed to reserve"); 

NB: pour comstackr j’utilise: gcc -std = c99 -pedantic …

Vous ne devriez pas mettre le test de malloc() dans un assert() : il ne sera pas compilé dans la compilation. Je n’ai pas utilisé assert() dans le programme suivant.

 #include  #include  void *mymalloc(size_t siz, size_t length, const char *message, const char *f, int l) { void *x = malloc(siz * length); if (x == NULL) { fprintf(stderr, "a.out: %s:%d: MALLOC: " "Assertion `\"%s\" && x != ((void *)0)' failed.\n", f, l, message); fprintf(stderr, "Aborted\n"); exit(EXIT_FAILURE); } return x; } #define MALLOC(type, length, message)\ mymalloc(sizeof (type), length, message, __FILE__, __LINE__); int main(void) { int height = 100; double **masortingx = MALLOC(double *, height, "Failed to reserve"); /* work; */ free(masortingx); return 0; } 

Il n’y a pas d’équivalent standard à l’extension GCC que vous utilisez.

Vous pouvez obtenir le résultat équivalent en utilisant une fonction (éventuellement une fonction inline si vous utilisez C99) à la place du code de la macro. Vous avez toujours besoin d’une macro pour appeler cette fonction car l’un des arguments est un “nom de type” et vous ne pouvez pas le transmettre à des fonctions.

Voir la réponse de @pmg pour une illustration du type de fonction et de la macro l’utilisant.