美文网首页
C++ include和using namespace

C++ include和using namespace

作者: ArcherZang | 来源:发表于2019-05-30 16:39 被阅读0次

部分内容引用至:https://blog.csdn.net/u013719339/article/details/80221899
include是把整个文件复制进来,
using namespace这会告诉编译器,每次它看到一个类型(比如向量)时,还要检查命名空间std,因为定义可能在那里;如果要使用的命名空间不在当前文件,需要include进来,然后才能使用using namespace。

include与using namespace无必然联系功能也不一样。

  • Include

    • #include "math.h",就是编译的时候把文件内容全部都加载进来
      c是.h;c++后面没有,例如:

      #include "math.h"
      #include <cmath>
      

      #include <>#include "" 都会在实现定义的位置查找文件,并将其包含。
      区别是若 #include "" 查找成功,则遮蔽 #include <> 所能找到的同名文件;否则再按照#include <>的方式查找文件。另外标准库头文件都放在 #include <> 所查找的位置。

      一般来说 #include <> 的查找位置是标准库头文件所在目录, #include "" 的查找
      位置是当前源文件所在目录。不过这些都可由编译器调用参数等配置更改。

    • .h文件注意点
      声明可以重复,定义不能重复。在.h文件中定义变量或函数,当不同的.cpp文件include就会导致多重定义错误
      .h初衷是为了解决每次使用一个其他文件的函数就要声明一次的问题。
      注意不要在.h文件中using namespace stdusing std:cout,因为会导致以下问题:

      1. 同一类型string ,在不同空间定义同时使用using namespace导入,会导致编译器选错类型,且不易找出。
      2. using namespace stdusing std:cout的变量cout与本地文件内变量cout冲突,尽量在方法内部使用using std:cout
      3. using namespace stdusing std:cout的变量cout与其他命名空间之间也会存在冲突,报不确定性错误。
        .cpp可做下面的事:
            (1) 全局函数定义,全局变量定义
            (2) 静态函数定义、静态变量定义。(指定编译单元内部使用的函数和变量),程序优先使用内部的。
            (3) 静态函数声明(指 static void test();)、静态变量声明(指 static int a)。
        .h内可做下面的事:
            (1) 全局函数声明,无静态函数。
            (2) 全局变量声明(指 extern int a),无静态变量。
  • using namespace
    using namespace std;
    是指标识符的各种可见范围。C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此群组的名字。可以防止命名冲突。

    1. 命名空间内函数或者变量使用方式:
      第一种:using namespace std,然后使用函数或者变量 cout
      第二种:using std::cout,然后使用函数或者变量 cout
      第三种:命名空间冒号后面接函数或者变量 std::cout
    2. 命名空间通过下面的方式在其他文件被调用:
      最外层命名空间只能定义在.h中
    3. 命名空间下 可以放函数、变量、结构体、类,命名空间可以嵌套命名空间,
    4. 最外层命名空间必须定义在全局作用域下,.h.cpp都可以,
    5. 命名空间是开放的,可以随时在原先的命名空间添加内容,只能对.h和当前文件合并
      通过合并方式,且只能在当前文件使用
    6. 命名空间可以无名,相当于写了 static int m_c,只能在当前文件内使用
    7. 命名空间可以使用别名
    8. 局部变量和命名空间变量冲突,命名空间之间变量冲突;所有尽量不要用using
      using namespace std是编译指令
      using std::cout是声明
      就近原则高于编译指令
      就近原则和声明等级一样,就会出现二义性
      int atk () {
      int cout = 10;
      using std:cout;
      using wd:cout;
      using abk;
      return cout;
      }
      方法内局部变量cout和using std::cout,就近原则和声明,等级一样,就会出现二义性
      使用两个及以上命名空间相同变量,同时编译指令或者声明指令,等级一样,也会出现二义性。


      使用 namespace
      起别名

相关文章

网友评论

      本文标题:C++ include和using namespace

      本文链接:https://www.haomeiwen.com/subject/jkuoaqtx.html