gpt4 book ai didi

c++ - 有没有办法弃用命名空间?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:28 24 4
gpt4 key购买 nike

简而言之:有没有办法在 gcc 或 clang 中弃用命名空间?

长:

多年来,我们一直在一个包罗万象的命名空间中积累各种各样的东西。现在我们决定对其进行一些排序,并将 namespace 拆分为适当命名的名称;所以:

namespace util
{
uint32_t codecID( const char * name ) ;

void alignStrings( std::vector< std::string > * strings ) ;
}

应该变成

namespace codec
{

uint32_t codecID( const char * name ) ;

}

namespace fmt
{

void alignStrings( std::vector< std::string > * strings ) ;

}

只是为了增加乐趣,旧的命名空间是在几个包含文件中定义的。那里的一切都是内联/模板代码;所以没有与之关联的库。

显而易见的解决方案是将所有定义从旧命名空间复制到新命名空间,并将旧命名空间中的所有内容逐项标记为已弃用。

我们不能只重命名命名空间而不破坏几个项目。

现在我想知道是否有更好的方法来做这样的事情,例如将 namespace util 的使用标记为已弃用。

我们使用 gcc 4.7.3 作为我们的生产编译器,但是针对 clang 进行构建和测试以尝试捕捉 gcc 细节;所以在任何这些编译器上工作的东西都会有所帮助。

最佳答案

在 C++14 中,我们可以应用 attributes命名空间(尽管 gcc 似乎忽略了该属性)。这是通过 defect report 1657 实现的具有 CD4 状态,这意味着它应该适用于 C++14。

引入新措辞的论文是N4196 :

However, attributes are not permitted on enumerators nor on namespaces. In response, CWG issue 1657 and EWG issue 113 were filed and received favourably. This paper proposes resolving these issues by allowing attributes to be specified on enumerators and namespaces, and extends the [[deprecated]] attribute to apply to these entities, as was originally intended.

参见 a live godbolt example :

namespace [[deprecated]] util {

在 clang 中,如果我们使用 codecID,我们会看到以下警告:

warning: 'util' is deprecated [-Wdeprecated-declarations]
util::codecID( "hello") ;
^
note: 'util' has been explicitly marked deprecated here
namespace [[deprecated]] util
^

尽管 clang 警告这是一个 C++17 特性(我认为这是一个错误)并且 gcc 警告该属性被忽略,尽管说 it supports for it as a C++17 feature .

关于c++ - 有没有办法弃用命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22806878/

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