编译器找不到“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函数的系统更多的系统。

笔记

  1. 这意味着你不应该把#define放在头文件中,因为在第一个包含之前不能包含头文件:)但是,如果你使用#include "config.h"这样的东西来包含平台定义和每个源代码文件以#include "config.h"开头,在任何其他#include之前,并且#define出现在任何#include之前的config.h ,你应该没问题。

使用glibc在GNU linux上尝试以下操作

 #define _GNU_SOURCE #include  

请注意,定义宏是从头文件源中提取的。