不应在头文件中使用 using 指令
4.4 ID_usingNamespaceInHeader
在头文件的全局作用域中使用 using 指令极易造成命名冲突,且影响范围难以控制。
如果代码涉及多个命名空间,而这些命名空间中又有名称相同且功能相似的代码元素时,将造成难以排查的混乱。对于库的头文件,更应该严禁使用全局的 using 指令,否则造成对用户命名空间的干扰。
示例:
// In a header file
namespace NS {
void foo(short);
}
using namespace NS; // Non-compliant, a using-directive in a header
using namespace std; // Non-compliant, a using-directive in a header
下例展示的问题是头文件不同的包含顺序竟导致同一函数产生了不同的行为:
// In a.h
void foo(char);
namespace ns {
void foo(int);
}
inline void bar() {
foo(0);
}
// In b.h
namespace ns {}
using namespace ns;
// In a.cpp
#include "a.h"
#include "b.h"
void fun1() {
bar(); // ‘bar’ calls ‘foo(char)’
}
// In b.cpp
#include "b.h"
#include "a.h"
void fun2() {
bar(); // ‘bar’ calls ‘foo(int)’
}
头文件 a.h 和 b.h 以不同的顺序被包含,使 bar 函数调用了不同的 foo 函数,导致这种混乱的正是 b.h 中的 using 指令。
相关
参考
C++ Core Guidelines SF.7
MISRA C++ 2008 7-3-6