部分内容引用至: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 std
和using std:cout
,因为会导致以下问题:- 同一类型string ,在不同空间定义同时使用using namespace导入,会导致编译器选错类型,且不易找出。
-
using namespace std
和using std:cout
的变量cout与本地文件内变量cout冲突,尽量在方法内部使用using std:cout
。 -
using namespace std
和using 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++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此群组的名字。可以防止命名冲突。- 命名空间内函数或者变量使用方式:
第一种:using namespace std,然后使用函数或者变量 cout
第二种:using std::cout,然后使用函数或者变量 cout
第三种:命名空间冒号后面接函数或者变量 std::cout - 命名空间通过下面的方式在其他文件被调用:
最外层命名空间只能定义在.h中 - 命名空间下 可以放函数、变量、结构体、类,命名空间可以嵌套命名空间,
- 最外层命名空间必须定义在全局作用域下,
.h
和.cpp
都可以, - 命名空间是开放的,可以随时在原先的命名空间添加内容,只能对.h和当前文件合并
通过合并方式,且只能在当前文件使用 - 命名空间可以无名,相当于写了 static int m_c,只能在当前文件内使用
- 命名空间可以使用别名
-
局部变量和命名空间变量冲突,命名空间之间变量冲突;所有尽量不要用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
起别名
- 命名空间内函数或者变量使用方式: