Domanda

Come posso fare quanto segue in modo 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: per compilare utilizzo: gcc -std = c99 -pedantic ...

È stato utile?

Soluzione

Non dovresti mettere il test per malloc () in un assert () : non verrà compilato quando esegui una build di rilascio. Non ho usato assert () nel seguente programma.

#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;
}

Altri suggerimenti

Non esiste uno standard equivalente all'estensione GCC in uso.

Puoi ottenere il risultato equivalente usando una funzione (possibilmente anche una funzione inline se stai usando C99) al posto del codice nella macro. Hai ancora bisogno di una macro per invocare quella funzione perché uno degli argomenti è un 'nome tipo' e non puoi passarli a funzioni.

Vedi la risposta di @pmg per un'illustrazione del tipo di funzione e macro che la utilizza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top