编译器找不到"aligned_alloc"函数
compiler can't find "aligned_alloc" function
正在尝试获取一个可移植函数,以便在具有对齐特性的堆上进行分配。
找到了"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函数的系统更多的系统。
备注
- 这意味着您不应该将
#define
放在头文件中,因为头文件不能包含在第一个include之前:)但是,如果您使用类似#include "config.h"
的东西来包含平台定义,并且每个源文件都以#include "config.h"
开头,在任何其他#include
之前,并且#define
出现在config.h
中,在任何#include
之前,您应该可以
使用glibc 在GNU linux上尝试以下操作
#define _GNU_SOURCE
#include <cstdlib>
请注意,定义宏是从头文件源中提取的。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 在分配器中使用new函数和*alloc函数时,它们之间有区别吗