fish.h
#ifndef __test_header__fish__ #define __test_header__fish__ #include <stdio.h> namespace ns_fish { void fish_show(); } #endif /* defined(__test_header__fish__) */fish.cpp
#include <iostream> #include "fish.h" using namespace std; //using namespace ns_fish; void fish_show() { cout<<"fish show"<<endl; }
cat.h
#ifndef __test_header__cat__ #define __test_header__cat__ #include <stdio.h> namespace ns_cat{ void cat_show(); } #endif /* defined(__test_header__cat__) */cat.cpp
#include <iostream> #include "cat.h" //using namespace ns_cat; using namespace std; void cat_show(){ cout<<"cat show"<<endl; }
main.cpp
#include <iostream> #include "fish.h" #include "cat.h" using namespace std; using namespace ns_cat; using namespace ns_fish; int main(int argc, const char * argv[]) { // insert code here... fish_show(); cat_show(); return 0; }
如果在cat.cpp文件中定义另一个cat_show函数,该函数不在命名空间ns_cat下的话,mian中直接调用cat_show就会产生编译错误,提示歧义,所以这时候就必须在调用时加上命名空间以示区分,而不能单独用using namespace来区分。
最佳实践:头文件中不应该包含using声明,因为这样就会导致包含了该头文件的其他文件被迫使用了某个未知的命名空间,可能会导致意想不到的名字冲突问题。