C++ 有没有一种方法可以弃用名称空间?
简而言之:有没有办法在gcc或clang中弃用名称空间 长报告: 多年来,我们一直在一个包罗万象的名称空间中积累各种各样的东西。现在我们决定对其进行排序,并将名称空间拆分为正确命名的名称空间;因此:C++ 有没有一种方法可以弃用名称空间?,c++,gcc,namespaces,clang,C++,Gcc,Namespaces,Clang,简而言之:有没有办法在gcc或clang中弃用名称空间 长报告: 多年来,我们一直在一个包罗万象的名称空间中积累各种各样的东西。现在我们决定对其进行排序,并将名称空间拆分为正确命名的名称空间;因此: namespace util { uint32_t codecID( const char * name ) ; void alignStrings( std::vector< std::string > * strings ) ; } namespace-util { uint32
namespace util
{
uint32_t codecID( const char * name ) ;
void alignStrings( std::vector< std::string > * strings ) ;
}
namespace-util
{
uint32_t codecID(常量字符*名称);
void alignStrings(std::vector*字符串);
}
应该成为
namespace codec
{
uint32_t codecID( const char * name ) ;
}
namespace fmt
{
void alignStrings( std::vector< std::string > * strings ) ;
}
名称空间编解码器
{
uint32_t codecID(常量字符*名称);
}
名称空间fmt
{
void alignStrings(std::vector*字符串);
}
为了增加乐趣,旧名称空间是跨多个include文件定义的。其中的所有内容都是内联/模板代码;因此没有与之关联的库
显而易见的解决方案是将所有定义从旧名称空间复制到新名称空间,并将旧名称空间中的所有内容逐项标记为已弃用
我们不能在不中断几个项目的情况下重命名名称空间
现在我想知道是否有更好的方法来做类似的事情,比如将namespace util的使用标记为不推荐
我们使用GCC4.7.3作为我们的产品编译器,但是构建和测试clang以尝试捕捉gcc细节;因此,对这些编译器中的任何一个进行操作都会有所帮助。如果在新的头文件中定义新的名称空间,则可以完全使用指令而不是逐项弃用旧的冗余头文件。libstdc++。Clang也支持该指令,但以MSVC为例。在C++14中,我们可以应用于名称空间(尽管gcc似乎忽略了该属性)。这是通过CD4状态实现的,这意味着它应该应用于C++14 引入新措辞的文件是: 但是,枚举数和命名空间上都不允许使用属性。作为回应,CWG第1657期和EWG第113期被提交并获得好评。本文建议通过允许在枚举数和名称空间上指定属性来解决这些问题,并扩展[[deprecated]]属性以应用于这些实体,正如最初的意图一样 请参阅: 在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特性(我相信这是一个bug),gcc警告该属性被忽略,尽管它说。好主意;它将与一些标题一起工作。然而,其他人有我们想要保留的好的描述性名称。。。使用
std=c++11
编译时使用头文件,因此它们不会丢失任何漂亮的头文件名。
warning: 'util' is deprecated [-Wdeprecated-declarations]
util::codecID( "hello") ;
^
note: 'util' has been explicitly marked deprecated here
namespace [[deprecated]] util
^