编译器找不到“aligned_alloc”函数
尝试在具有对齐function的堆上分配可移植函数。
找到“aligned_alloc”,我认为这是在stdlib.h中,但gcc似乎不这么认为
错误:未在此范围内声明’aligned_alloc’
使用gcc with flags -std = c ++ 11 -m64
尝试导入
#include #include
aligned_alloc
在C11中定义。 它(尚未)为C ++定义,尽管它可能出现在C ++ 17中。 (也就是说,它不在标准C库中的(当前)209函数列表中,这些函数应该在标准C ++库中可用。请参阅C ++标准的附录C.)
( 2018年8月更新 : aligned_alloc
确实是由C ++ 17定义的,如上所述。所以如果你有一个足够新的C ++编译器,你应该能够通过指定使用来避免所有关于function测试宏的麻烦C ++ 17;对于g++
和clang++
,可以使用-std=c++17
命令行标志。)
如果要将它与gcc一起使用(或者更具体地说,使用g ++),则应使用function测试宏_ISOC11_SOURCE
。 与所有特征测试宏一样,在任何#include
之前,此宏必须在每个需要它的文件中#include
。 [参见注释1](如果使用-std=c11
编译C程序,则不需要使用function测试宏。)
我从man aligned_alloc
找到了正确的function测试宏:
glibc的function测试宏要求(参见feature_test_macros(7)):
posix_memalign(): _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 aligned_alloc(): _ISOC11_SOURCE
如上所示,您可以阅读
man 7 feature_test_macros
有关function测试宏的更多信息,包括glibc识别的宏列表,以及每个宏应用的时间。
aligned_alloc
联机帮助页还记录了非常相似的posix_memalign
函数,该函数自问题6以来一直是Posix标准的一部分,并且具有不同(和更常见)的特征测试宏,如上所述。 posix_memalign
应该可以移植到任何Posix系统,它可能包含或不包含比那些接受在C ++中使用C11函数的系统更多的系统。
笔记
- 这意味着你不应该把
#define
放在头文件中,因为在第一个包含之前不能包含头文件:)但是,如果你使用#include "config.h"
这样的东西来包含平台定义和每个源代码文件以#include "config.h"
开头,在任何其他#include
之前,并且#define
出现在任何#include
之前的config.h
,你应该没问题。
使用glibc在GNU linux上尝试以下操作
#define _GNU_SOURCE #include
请注意,定义宏是从头文件源中提取的。