
我试过:
>一个明确的专业化与静态断言
#include <string>#include <type_traits>template<> std::basic_string<char> &std::basic_string<char>::operator=(char c) { static_assert(false,"Don't use this!");} 其失败为< string>已经对std :: string进行了明确的实例化
> [[deprecated]]属性,应用于上述各种类似的声明;没有任何立场,我尝试似乎产生了合理的结果;
> =删除,由于类似于上述原因而失败;
>我想到使用链接器技巧(在同样的项目中,我们使用–wrap ld链接器选项对流行setlocale用法进行运行时检查),但是这是一个模板和内联方法,这使事情变得复杂.
现在问题:
有没有一个标准的方法,以某种方式禁用(就像delete一样)标准库中的任何函数或方法(读取:在一个库中,您不能更改标题中的声明)?
>,而不是禁用,添加一个警告(如[[deprecated]])会发生);
>标准方法失败,是否有特定的g?
>如果没有“一般”(=适用于任何方法,任何类,任何函数,…)解决方案,我们可以应用于这种特定情况(=禁用模板类的方法,甚至可能只是一个具体的实例)?
$g++ -O0 test.cpp -Wl,--wrap=_ZNSsaSEc
说明:
_ZNSsaSEc是您的违规功能的装饰名称:
$echo _ZNSsaSEc | c++filtstd::basic_string<char,std::char_traits<char>,std::allocator<char> >::operator=(char)
-Wl编译器选项是将选项传递给链接器.
而–wrap =< symbol>链接器选项将对给定符号的任何引用转换为替代__wrap_< symbol>.而且既然(希望)没有定义一个名为__wrap__ZNSsaSEc的函数,你会得到一个很好的链接器错误:
test.cpp:(.text+0x26): undefined reference to `__wrap__ZNSsaSEc'
而-O0是禁用优化,并阻止编译器内联函数.如果有内联的链接技巧将不起作用,因为@SergeBallesta在注释中指出.
也许是一个黑客,但嘿,它的作品!
总结以上是内存溢出为你收集整理的c – 如何在我的项目中将*标准库*函数/方法标记为已弃用(或完全禁用)?全部内容,希望文章能够帮你解决c – 如何在我的项目中将*标准库*函数/方法标记为已弃用(或完全禁用)?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)