反对在标头中使用的指南是否适用于别名声明?

问题描述 投票:0回答:1

我知道在 C++ 头文件中不要使用

using
的指导,其原因已被广泛讨论,例如这里

当我看到

这篇文章
描述“别名声明”时,我正在寻找一种更 C++ 的替代方案来替代 typedef

现在,仅仅因为概念在我的脑海中变得混乱,我不清楚反对在标题中使用

using

 的指南是否专门针对这种使用方式:

// my_header.h #ifndef MY_HEADER_H #define MY_HEADER_H using namespace std; #endif
...或者它也适用于别名声明吗?

由于这种情况,我想使用 typedef/别名声明/功能上等效的东西:

// my_header.h #ifndef MY_HEADER_H #define MY_HEADER_H #include <tuple> // This function's signature is getting cumbersome int func(const std::tuple<a:really:long_namespaced::thing, a:really:long_namespaced::thing, a:really:long_namespaced::thing>& tup = {1, 2, 3}); #endif
基本上,函数签名很笨拙,因为它的参数文本太长了。

如果头文件中不鼓励使用

using

 进行别名声明,那么普遍接受的使其更具可读性的方法是什么?

c++ typedef using alias-declaration
1个回答
0
投票
这里发生了一些事情。 当您执行

using namespace std; 时,使用 using-declaration

 会将 
std
 中的所有名称导入到当前作用域中。  如果该范围是头文件的全局范围,则包含该文件的其他任何内容也将获得这些名称,这可能会导致问题,这就是为什么强烈建议不要这样做。

使用声明的第二件事是,您可以从像

using std::string

 这样的命名空间导入单个名称,它将名称 
string
std
 导入到作用域中。  这比 
using namespace std
 没那么糟糕,但如果代码中存在其他 
string
 类型,仍然可能会导致问题。

这将我们带到了

using-alias,它使用单词 using

,但其行为就像 
typedef
 一样的别名声明。  这可以让你做类似的事情

using string_t = std::string
然后您可以使用 

string_t

 代替 
std::string
。  这可以避免将 
string
 中的 
std
 添加到范围中,但仍然允许您将其用作 
string_t
 而不是 
std::string
。  将其与您的示例代码一起使用,我们得到

using thing_t = a_really_long_namespaced::thing; int func(const std::tuple<thing_t, thing_t, thing_t>& tup = {1, 2, 3});
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.