c/c++语言开发共享ISO C等同于表达式中的支撑组

如何以兼容(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  #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, "Abortedn"); 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的答案,了解使用它的函数类型和宏。

      以上就是c/c++开发分享ISO C等同于表达式中的支撑组相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/544633.html

      (0)
      上一篇 2021年1月9日
      下一篇 2021年1月9日

      精彩推荐