命名空间和 C 头文件中“使用命名空间”的危险
Bruce Eckel 在他的书“Thinking in C”中警告说在头文件中包含“using namespace”指令。该指令消除了命名空间保护,允许在编译单元内全局访问命名空间中的符号。
示例
考虑以下程序:
<code class="cpp">#include <string> using namespace std; // Custom definition of a struct named "string" struct string { const char* p; }; int main() { string x; // Error: Ambiguous, which "string" is intended? }</code>
尝试编译时,编译器遇到歧义问题:主函数中的标识符“string”可以引用用户定义的结构体或标准库类。
对头文件的影响
如果将程序的顶部部分(第 1 行到第 5 行)提取到单独的头文件中并包含在包含 main 函数的源文件中,则歧义问题将持续存在。这是因为“using namespace”指令将不合格名称解析的影响扩展到整个编译单元,包括直接或间接包含有问题标头的所有标头。
后果和限制
在标头中使用“using namespace”可能会导致几个问题:
也就是说,在头文件中的特定类或函数范围内使用“using namespace”不会造成相同的风险,因为该指令的效果仅限于其出现的范围。
以上是为什么应该避免在 C 头文件中使用'using namespace”?的详细内容。更多信息请关注PHP中文网其他相关文章!