现象

在1个C++工程中的某个头文件中,为了避免冗长的name space 前缀,使用了using, 编译后结果如下:
在基础库中都出现错误:

libs/common/status.h:91:44: error: ‘StringVprintf’ was not decl│ared in this scope StringVprintf(&result, format, args);

分析

问题1:

在一个头文件中有如下的 using:

using kunlun::common::Status;

问题2:

某个头文件中出现如下代码:

“`
namespace A;
namespace B;

<pre><code>include <x .h>
include <y .h>
</code></pre>

“`

教训

理清基本用法

  • namespace
    声明一级namespace;
  • using

指定使用一个namespace 下的成员或者方法

  • using namespace

指定使用一个namespace,而非其下的成员或者方法

遵循重要规则

头文件里不要用using namespace。因为头文件内容相当于一段代码的公开部分,会在预处理阶段被替换进引用者的源文件里。使用using namespace会对引用者产生侵入性,使得引用你的头文件有很多未知的副作用。不仅using namespace,任何using都是要尽量避免的。任何类型函数都应该写全名。如果在源文件中用using namespace就是个人的选择了。特别是项目小没有很多重名的时候。如果你看到Google c++ style guide上说不要用using namespace std,更多是因为代码库里有很多std的补充替代品,比如absl。使用时注明用的是哪个可读性比较好。

作者:Hong Dp
链接:https://www.zhihu.com/question/26911239/answer/1260378500
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一般说来,使用using命令比使用using编译命令更安全,这是由于它只导入了制定的名称。如果该名称与局部名称发生冲突,编译器将发出指示。using编译命令导入所有的名称,包括可能并不需要的名称。如果与局部名称发生冲突,则局部名称将覆盖名称空间版本,而编译器并不会发出警告。另外,名称空间的开放性意味着名称空间的名称可能分散在多个地方,这使得难以准确知道添加了哪些名称。…然而名称空间的支持者希望有更多的选择,既可以使用解析运算符面也可以使用using声明,也就是说,不要这样做:using namespace std; // avoid as too indiscriminate(随意)
而应这样做int x;
std::cin >> x ;
std::cout < < x << std::endl;
或者这样做using std::cin;
using std::cout;
using std::endl;
int x;
cin >> x;
cout << x << endl;

作者:mani.active
链接:https://www.zhihu.com/question/26911239/answer/51503880
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。