编译器找不到"aligned_alloc"函数

compiler can't find "aligned_alloc" function

本文关键字:alloc 函数 aligned 找不到 编译器      更新时间:2023-10-16

正在尝试获取一个可移植函数,以便在具有对齐特性的堆上进行分配。

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

错误:未在此作用域中声明"aligned_alloc"

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

尝试导入

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

aligned_alloc在C11中定义。虽然它可能出现在C++17中,但还没有为C++定义它。(也就是说,它不在标准C++库中预期可用的标准C库中的209个函数的列表中(当前)。参见C++标准的附录C。)

2018年8月更新:如上所述,aligned_alloc确实是由C++17定义的。因此,如果你有一个足够新的C++编译器,你应该能够通过指定使用C++17来避免所有功能测试宏的麻烦;对于g++clang++,这可以通过-std=c++17命令行标志来完成。)

如果您想将它与GCC一起使用(或者更具体地说,与g++一起使用),您应该使用功能测试宏_ISOC11_SOURCE。与所有功能测试宏一样,该宏在每个需要它的文件中都必须是#define’d,然后才是任何#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之前:)但是,如果您使用类似#include "config.h"的东西来包含平台定义,并且每个源文件都以#include "config.h"开头,在任何其他#include之前,并且#define出现在config.h中,在任何#include之前,您应该可以

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

#define _GNU_SOURCE
#include <cstdlib>

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