编译器找不到"aligned_alloc"函数

Tho*_*mas 9 c c++

尝试使用对齐功能在堆上分配可移植函数.

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

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

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

尝试导入

#include <stdlib.h>
#include <cstdlib>
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 10

aligned_alloc在C11中定义.它(尚未)为C++定义,尽管它可能出现在C++ 17中.(也就是说,它不在标准C库中的(当前)209函数列表中,这些函数应该在标准C++库中可用.请参阅C++标准的附录C.)

(更新于2018年8月:aligned_alloc确实是由C++ 17定义的,如上所述.所以如果你有一个足够新的C++编译器,你应该能够通过指定使用C++ 17; for g++clang++,可以使用-std=c++17命令行标志.)

如果要将它与gcc一起使用(或者更具体地说,使用g ++),则应使用功能测试宏_ISOC11_SOURCE.与所有功能测试宏一样,此宏必须#define在每个需要它之前的文件中#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
Run Code Online (Sandbox Code Playgroud)

如上所示,您可以阅读

man 7 feature_test_macros
Run Code Online (Sandbox Code Playgroud)

有关功能测试宏的更多信息,包括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,你应该没问题.