ISO C эквивалент групповых фигур в выражениях

StackOverflow https://stackoverflow.com/questions/1626397

  •  06-07-2019
  •  | 
  •  

Вопрос

Как я могу сделать следующее в соответствии (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");

Примечание: для компиляции я использую: gcc -std = c99 -pedantic ...

Это было полезно?

Решение

Не следует помещать тест для malloc () в assert () : он не будет скомпилирован во время сборки выпуска. Я не использовал assert () в следующей программе.

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

Другие советы

Стандартного эквивалента используемого расширения GCC не существует.

Вы можете получить эквивалентный результат, используя функцию (возможно, даже встроенную функцию, если вы используете C99) вместо кода в макросе. Вам по-прежнему нужен макрос для вызова этой функции, поскольку один из аргументов является «именем типа», и вы не можете передать их в функции.

См. ответ @pmg для иллюстрации типа функции и макроса, использующего ее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top