gpt4 book ai didi

c++ - 如何在我的项目中将 *standard library* 函数/方法标记为已弃用(或完全禁用)?

转载 作者:可可西里 更新时间:2023-11-01 16:14:29 25 4
gpt4 key购买 nike

我正在尝试以某种方式禁用/标记为已弃用的丑陋 std::string::operator=(char)重载(根据我的经验,仅在错误地将整数分配给字符串时才使用它,并导致微妙且难以跟踪的错误)。

我试过:

  • 其中包含静态断言的显式特化

    #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]]属性,在不同位置应用于与上述类似的声明;我尝试过的任何立场似乎都没有产生任何合理的结果;
  • =delete , 由于与上述类似的原因而失败;
  • 我考虑过使用链接器技巧(类似地,在同一个项目中,我们使用 setlocale --wrap 链接器选项对偏离的 ld 用法进行了运行时检查),但事实是这是一个模板并且内联方法使事情复杂化。

现在回答问题:

  • 是否有一种标准方法可以以某种方式禁用(如 =delete 所发生的那样)标准库中的任何函数或方法(阅读:在您无法更改 header 中的声明的库中)?
  • 同上,但不是禁用,而是添加警告(与 [[deprecated]] 一样);
  • 标准方法失败,是否有特定于 g++ 的内容?
  • 如果没有“通用”(=适用于任何方法、任何类、任何函数,...)解决方案,是否有一些我们可以应用于此特定情况的方法(=禁用模板类的方法,可能甚至只是一个特定的实例)?

最佳答案

您可以使用以下编译器/链接器选项:

$ g++ -O0 test.cpp -Wl,--wrap=_ZNSsaSEc

解释:

_ZNSsaSEc是您违规功能的装饰名称:

$ echo _ZNSsaSEc | c++filt
std::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 在评论中指出的那样,如果有内联,链接器技巧将不起作用。

也许有点 hack,但是,嘿,它有效!

关于c++ - 如何在我的项目中将 *standard library* 函数/方法标记为已弃用(或完全禁用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33778051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com