C++:#include和using namespace

た 入场券 2022-05-25 02:50 277阅读 0赞

  首先要明确的是:在C中,没有namespace。
  在C++中,既有#include,又有using namespace。前者通常定义在.h文件中,后者直接写在.cpp文件中。#include用于添加文件到project中,而namespace使对象在逻辑模块中。
  也即是:
  #include用于引用其他文件的内容(如#include “a.h”),编译器在编译时,在使用include的文件中(如名为main.cpp),将include这句话替换为其文件内容,相当于物理上的复制替换。

  1. //a.h
  2. void fun();

  当不同的两个文件中,使用了相同的函数名(a.h 和b.h两个文件中都有fun()),函数内容却不同,根据上文来看,如果使用include同时引用两个文件,则在编译时,mai.cpp文件中出现了两个fun(),因此重名,后面调用函数时也不知道调用的哪个函数。
  那么,如何避免上面出现的问题呢?这就需要使用命名空间namespace,把两个函数定义在不同的命名空间中,然后在需要调用函数的文件中加入using namespace(注意#include也需要写),将当前使用的函数链接到它声明的地方。

  1. //a.h
  2. namespace f1 {
  3. void fun();
  4. }
  5. //a.cpp
  6. namespace f1 {
  7. void fun()
  8. {
  9. int c = 0;
  10. }
  11. }
  12. //main.cpp
  13. #include "a.h"
  14. using namespace f1;
  15. int main()
  16. {
  17. fun();
  18. }
  19. //或者
  20. #include "a.h"
  21. int main()
  22. {
  23. f1::fun();
  24. }

  在上面的main.cpp中,第一种方法,使用 using namespace,则当前整个文件中使用的fun()都会链接到命名空间为f1的函数fun()中。那么如果在main.cpp文件中既想使用f1中的fun(),又想用f2(b.h的命名空间)中的fun(),则使用 using namespace链接两个命名空间吗?这会造成下面函数调用时依旧指向不明,会报链接错误。这时就需要使用上面的第二种方法,不在文件顶部使用using namespace,而是在调用函数时写出命名空间进行链接。
  
    
以下为C++: using namespace and #include的翻译内容

  例如:你有一个向量类vector.h,则把它加入到project中。vector是标准库STD中的一部分,因此可以使用以下语句来进入向量类:

  1. std::vector

  然而,如果程序员由于懒而不想在所有地方写std::(标准库有非常多有用的地方),则可以在.cpp文件的顶部写:

  1. using namespace std

  这会告诉编译器,每次它看到一个类型(比如向量)时,还要检查命名空间std,因为定义可能在那里。这样,就等价于以下声明:

  1. std::vector
  2. vector

  在vector.h中,会看到类似于下面的语句:

  1. namespace std
  2. {
  3. class vector { /* Implementation */ }
  4. }

  因此,#include是用于添加文件,而using namespace用于保持代码结构整洁干净,并将其打包在“有意义”的库中。当你编程时可以省略using namespace,但绝对需要使用#include。

发表评论

表情:
评论列表 (有 0 条评论,277人围观)

还没有评论,来说两句吧...

相关阅读

    相关 c++ using namespace std;

    一、先说<iostream.h>和<iostream>这两个被\include的预处理命令,它们是不一样的,它们其实是2个文件,两个文件的内容也是不一样的,.h的文件新的C++