我知道在 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
进行别名声明,那么普遍接受的使其更具可读性的方法是什么?
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});