尝试在具有对齐功能的堆上分配可移植函数。
找到“aligned_alloc”,我认为是在stdlib.h中,但gcc似乎不这么认为
错误:未在此范围内声明'aligned_alloc'
使用带有标志的gcc -std = c ++ 11 -m64
尝试导入
#include <stdlib.h>
#include <cstdlib>
答案 0 :(得分:9)
aligned_alloc
在C11中定义。它(尚未)为C ++定义,尽管它可能出现在C ++ 17中。 (也就是说,它不在标准C库中的(当前)209函数列表中,这些函数应该在标准C ++库中可用。请参阅C ++标准的附录C.)
( 2018年8月更新:aligned_alloc
确实由C ++ 17定义,如上所述。所以,如果你有一个足够新的C ++编译器,你应该能够避免通过指定使用C ++ 17来解决功能测试宏的问题;对于g++
和clang++
,可以使用-std=c++17
命令行标志。)
如果要将其与gcc(或更具体地说,使用g ++)一起使用,则应使用功能测试宏_ISOC11_SOURCE
。与所有功能测试宏一样,此宏在任何需要#define
之前的文件中必须为#include
。 [参见注释1](如果您使用-std=c11
编译C程序,则不需要使用功能测试宏。)
我从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
函数,该函数自问题6以来一直是Posix标准的一部分,并且具有不同(和更常见)的特征测试宏,如上所示。 posix_memalign
应该可以移植到任何Posix系统,该系统可能包含或不包含比在C ++中使用C11函数的系统更多的系统。
#define
放在头文件中,因为在第一个包含之前不能包含头文件:)但是,如果您使用#include "config.h"
之类的内容来包含平台定义,每个源文件都以#include "config.h"
开头,先于任何其他#include
,而#define
出现在任何config.h
之前#include
,您应该没问题答案 1 :(得分:0)
使用glibc
在GNU linux上尝试以下操作#define _GNU_SOURCE
#include <cstdlib>
请注意,定义宏是从头文件源中提取的。