Ответ 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
, вы должны быть в порядке.