Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有一种方法可以弃用名称空间?_C++_Gcc_Namespaces_Clang - Fatal编程技术网

C++ 有没有一种方法可以弃用名称空间?

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

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

长报告:

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

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
        ^