Question

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 **matrix = MALLOC(double *, height, "Failed to reserve");

NB: pour compiler, j'utilise: gcc -std = c99 -pedantic ...

Était-ce utile?

La solution

Vous ne devriez pas placer le test de malloc () dans un assert () : il ne sera pas compilé dans la version de publication. Je n'ai pas utilisé assert () dans le programme suivant.

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

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 **matrix = MALLOC(double *, height, "Failed to reserve");
  /* work; */
  free(matrix);
  return 0;
}

Autres conseils

Il n’existe 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 donnée par @pmg pour une illustration du type de fonction et de la macro l’utilisant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top