Этот вопрос связан с GLib для программирования на языке c. Исходный код здесь: https://github.com/GNOME/glib/blob/master/glib/gslice.h
В glist.h я увидел макрос _g_list_alloc0 и хочу знать, как он реализуется. Поэтому я возвращаюсь к нему.
#define _g_list_alloc0() g_slice_new0 (GList)
Затем вернитесь к макросу g_slice_new0.
#define g_slice_new0(type) ((type*) g_slice_alloc0 (sizeof (type)))
Хорошо, отслеживание до
gpointer g_slice_alloc0 (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
Для G_GNUC_MALLOC я обнаружил, что это на самом деле:
#define G_GNUC_MALLOC __attribute__((__malloc__))
#define G_GNUC_ALLOC_SIZE(x) __attribute__((__alloc_size__(x)))
Меня смущают последние два макроса G_GNUC_MALLOC и G_GNUC_ALLOC_SIZE.
Могу ли я заменить G_GNUC_ALLOC_SIZE(1) и G_GNUC_MALLOC на:
__attribute__((__alloc_size__(1)))
__attribute__((__malloc__))
Итак, замените макрос
gpointer g_slice_alloc0 (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
Макрос на самом деле определяет так:
gpointer g_slice_allo0 (gsize block_size)
__attribute__((__malloc__)) __attribute__((__alloc_size__(1)))
Мой вопрос: какое выражение
__attribute__((__malloc__)) __attribute__((__alloc_size__(1)))
работает или генерирует? Я думаю, это работает как
malloc(sizeof())
которые выделяют память на основе sizeof. Почему бы просто не использовать malloc(sizeof()) вместо завершенного выражения? что
__attribute__
? Это какое-то зарезервированное ключевое слово для бойкого?
gpointer g_slice_alloc0 (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1);
Каков тип выражения? Это не макрос или typedef. Это функция с макросом в качестве имени функции? Кто-нибудь может проанализировать это для меня?
Исходная ссылка здесь: https://github.com/GNOME/glib/blob/master/glib/gslice.h