Компилятор не может найти функцию "aligned_alloc"

Попытка получить переносимую функцию для размещения в куче с выровненной функцией.

Нашел "aligned_alloc", который, как мне кажется, находится в stdlib.h, но gcc, похоже, не считает это

error: 'aligned_alloc' не был объявлен в этой области

с использованием gcc с флагами -std = С++ 11 -m64

попытался импортировать

#include <stdlib.h>
#include <cstdlib>

Ответ 1

aligned_alloc определяется в C11. Он еще не определен для С++, хотя он может отображаться на С++ 17. (То есть он не входит в список (в настоящее время) 209 функций в стандартной библиотеке C, которые, как ожидается, будут доступны в стандартной библиотеке С++. См. Приложение C стандарта С++.)

Если вы хотите использовать его с gcc (или, более конкретно, с g++), вы должны использовать макрос проверки функций _ISOC11_SOURCE. Как и все макросы проверки функций, этот макрос должен быть #define 'd в каждом файле, который требует его перед любым #include. [См. Примечание 1] (Маска проверки функций не нужна, если вы компилируете программу C с помощью -std=c11.)

Я нашел правильный макрос теста функции из man aligned_alloc:

Требования к макросам проверки функций для glibc (см. feature_test_macros (7)):

  posix_memalign(): _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600

  aligned_alloc(): _ISOC11_SOURCE

Как это видно, вы можете прочитать

man 7 feature_test_macros

для получения дополнительной информации о макросах функций, включая список макросов, распознаваемых glibc, и когда они применяются.

Маска страницы aligned_alloc также документирует очень похожую функцию posix_memalign, которая была частью стандарта Posix с момента выпуска 6 и имеет разные (и более общие) макросы проверки функций, как указано выше. posix_memalign должен быть переносимым в любую систему Posix, которая может содержать или не включать больше систем, чем те, которые принимают использование функции C11 в С++.

Примечания

  • Это означает, что вы не должны помещать #define в заголовочный файл, так как файл заголовка не может быть включен до первого включения:) Однако, если вы используете что-то вроде #include "config.h" для включения определений платформы и каждого источника файл начинается с #include "config.h", перед любым другим #include, а #define встречается в config.h до любого #include, вы должны быть в порядке.

Ответ 2

Попробуйте выполнить следующие действия в GNU linux с помощью glibc

#define _GNU_SOURCE
#include <cstdlib>

Обратите внимание, что определение макроса было вытащено из источника файла заголовка.