سؤال

وكيف يمكنني أن أفعل ما يلي في (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");

ملاحظة: تجميع يمكنني استخدام: دول مجلس التعاون الخليجي -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;
}

نصائح أخرى

وليس هناك أي معيار لتمديد مجلس التعاون الخليجي الذي تستخدمه.

ويمكنك تحقيق النتيجة تعادل باستخدام وظيفة (وربما حتى دالة مضمنة إذا كنت تستخدم C99) بدلا من التعليمات البرمجية في الماكرو. ما زالت هناك حاجة ماكرو لاستدعاء هذه الوظيفة لأن واحدا من الحجج هو 'اسم نوع' وأنت لا يمكن أن تمر تلك إلى وظائف.

وانظر الإجابة من طرفpmg لتوضيح نوع وظيفة والكلي استخدامه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top