有没有一种方法可以弃用一个命名空间?

6

简述:在gcc或clang中是否有一种方法可以弃用命名空间?

详述:

多年来,我们一直在一个总称的命名空间中积累各种东西。现在我们决定对其进行整理,并将该命名空间拆分为适当命名的命名空间;因此:

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 ) ;

}

为了增加乐趣,旧命名空间在几个包含文件中定义。而且其中的所有内容都是内联/模板代码;因此没有与之相关联的库。

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

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

现在我想知道是否有更好的方法来做这样的事情,比如标记使用util命名空间的内容为已弃用。

我们使用gcc 4.7.3作为生产编译器,但构建和测试针对clang以尝试捕获gcc特定问题;因此,在任何这些编译器上工作的东西都会有所帮助。

2个回答

3
在C++14中,我们被允许将属性应用于命名空间(尽管gcc似乎忽略此属性)。这是通过defect report 1657提出的,并且具有CD4状态,这意味着它应该适用于C++14。
引入新措辞的文件是N4196:

但是,枚举器和命名空间上不允许使用属性。作为回应,CWG问题1657和EWG问题113被提出并得到了支持。本文提议通过允许在枚举器和命名空间上指定属性来解决这些问题,并将[[deprecated]]属性扩展到这些实体,正如最初预期的那样。

一个实时godbolt示例中查看它:
namespace [[deprecated]] util {

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

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

尽管clang警告这是C++17的特性(我认为这是一个错误),而gcc则警告该属性被忽略,但声称它支持作为C++17特性


2
如果您在一个新的头文件中定义了新的命名空间,您可以使用#warning指令整体废弃旧的冗余头文件,而不是逐个项目进行废弃。libstdc++ 就是这样做的。Clang也支持该指令,但例如MSVC不支持

好主意;它将与一些标题一起工作。然而,其他一些具有良好描述性名称的标题我们希望保留。 - Diego Sánchez
是的,当使用 std=c++11 进行编译时,libstdc++ 会使用它来处理 tr1/... 标头文件,因此它们不会失去任何漂亮的标头文件名。 - eerorika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接