编译器找不到“aligned_alloc”函数

时间:2015-03-25 03:45:42

标签: c++ c

尝试在具有对齐功能的堆上分配可移植函数。

找到“aligned_alloc”,我认为是在stdlib.h中,但gcc似乎不这么认为

  

错误:未在此范围内声明'aligned_alloc'

使用带有标志的gcc -std = c ++ 11 -m64

尝试导入

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

2 个答案:

答案 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函数的系统更多的系统。

备注

  1. 这意味着您不应将#define放在头文件中,因为在第一个包含之前不能包含头文件:)但是,如果您使用#include "config.h"之类的内容来包含平台定义,每个源文件都以#include "config.h"开头,先于任何其他#include,而#define出现在任何config.h之前#include,您应该没问题

答案 1 :(得分:0)

使用glibc

在GNU linux上尝试以下操作
#define _GNU_SOURCE
#include <cstdlib>

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