替换函数'operator new'不能声明'inline' [-werror,-winline-new-delete]
replacement function 'operator new' cannot be declared 'inline' [-Werror,-Winline-new-delete]
我在使用clang时遇到了这个错误。为什么运算符new不能内联声明?
./test.h:198:1: error: replacement function 'operator new' cannot be declared 'inline' [-Werror,-Winline-new-delete]
__forceinline void *operator new(size_t size) { return malloc(size); }
^
./test.h:18:23: note: expanded from macro '__forceinline'
#define __forceinline inline __attribute__((__always_inline__))
^
整个程序中分配函数的所有使用都必须兼容。在一个翻译单元中用operator new
分配的东西必须与另一个TU中的operator delete
不可分配。因此,程序必须在任何地方都有相同的实现,并且分配函数的替换不是TU的本地事务,而是全局选择。
因此,与其要求每个TU都包含相同的代码(这将破坏无声、非侵入性替换的目的,违反这种目的将极难诊断(,不如要求该功能具有外部链接,而不是内联。
将分配函数视为程序全局状态的一部分。
由于以下缺陷报告而被禁止:
https://cplusplus.github.io/LWG/issue404
原因是:
现有实现不允许内联函数作为替换内存分配功能。提供此功能将在某些情况下是困难的,并且被认为价值有限。
因此,最初的标准基本上没有任何偏好,因此,由于难以实现,实现选择了不允许它,因此标准也效仿并禁止了它。
相关文章:
- 使用 memcpy() 复制到 std::chrono::milliseconds 会给出错误 -Werror=clas
- 禁用/覆盖 -werror=sign-compare
- 当警告为错误时使用 [[已弃用]] 属性 (-Werror)
- 错误:ISO C++禁止可变长度数组"subVec"[-Werror=vla]
- 如何使用 GCC 编译指示启用选项 '-Werror'?
- 为什么我收到以下错误:"returning reference to temporary [-Werror=return-local-addr]"
- 默认的默认构造函数触发器 -Werror=effc
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- 错误:控制到达非空函数的末尾 [-Werror=返回类型] } ^
- 为什么海湾合作委员会抱怨"declaration of 'foo' shadows a previous call [-Werror=shadow]"
- g 编译选项,带有-STD = C 14编译错误显示Werror = C 11 -Compat
- C++:错误:成员访问不完整的类型,未使用的参数[-Werror,-Wunused-parameter]
- 控制达到非空隙函数的末端[-werror = return-type](只是一个简单的法官)
- Werror 不会将所有警告都变成错误
- gcc 4.9.2 错误 -Werror=sizeof-pointer-memaccess 中的错误
- cc1plus: error: -Werror=literal-suffix: no option -Wliteral-
- 哪些 g++ 开关可以帮助我编写好的代码,例如 -Wall -Werror
- 同一标志的重叠 -Werror 和 -Wno-error
- 卡萨布兰卡与boost 1.56失败,由于-Werror
- 替换函数'operator new'不能声明'inline' [-werror,-winline-new-delete]