如何以兼容(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