namespace
C语言
C语言中没有命名空间的概念,为了防止名字重复,一般函数的定义原则是库+函数名。例如:GLFWInit等。看到名字就知道是什么库的什么函数。
C++
命名空间的引入是为了解决命名冲突。当不同两个命名空间有形式相同的函数时,可以通过命名空间进行区别:(功能相当于注释部分)
// apple_print()
namespace apple{
void print(const char* text)
{
std::cout << text << std::endl;
}
}
// orange_print()
namespace orange{
void print(const char* text)
{
std::string temp = text;
std::reverse(temp.begin(), temp.end());
std::cout << temp << std::endl;
}
}
int main()
{
char* a = "hello";
// apple_print(a);
// orange_print(a);
apple::print(a); // hello
orange::print(a); // olleh
}
如果有多个命名空间嵌套的时候,可以使用namespace将复杂的嵌套命名用新的名字代替,如下:
namespace apple{
namespace function{
void print(const char* text)
{
std::cout << text << std::endl;
}
}
}
int main()
{
namespace appfunc = apple::function;
char* a = "hello";
appfunc::print(a);
orange::print(a);
}
另外,对于一些常用的函数,可以使用using来减少命名空间的书写:
using orange::print;
print("hello"); // olleh
但不管如何使用,都需要注意代码是否清晰,是否能够分辨到底调用的是哪个具体函数。
using namespace
using namespace std是一个很多初学者常用的方式,但这种方式并不推荐,因为会容易命名冲突或使用混淆。例如,如果引用一个自己写的库(ABC),里面重新实现了一个vector,使用using namespace std以后,你并不知道你调用的到底是哪个vector。因此比较推荐的方法是,将std::写出来,不用using namespace std。
另外,不要在头文件中使用using namespace。头文件使用这个会导致,通过命名空间来避免命名冲突或使用冲突的好处消失了。(头文件的作用域更广)