在C和C++中,#include后边有两种方式:<>和""。这两种方式有细微的区别,<>包含的是文件名,先在标准库中查找,如果找不到再在”环境变量“path中查找。
“”包含的是项目根目录里的文件名或者带绝对路径的文件名(或者说“”包含的是带有文件名的字符串)。
包含的文件会替换掉#include<>或#include"",为了防止重复包含,在预处理中有两种方法:
1:宏 #ifndef _AAAA_H #define _AAAA_H #endif 这里用宏标记该文件已被用过,说明已经存在了一份副本,不在需要复制(便于移植,绝大多数编译器都支持。宏名不能冲突)
2:特定的编译指令 #pragma once 确保该文件只被编译一次(如果有多个相同的文件,会被编译多次。例如在工程里加了两份除文件名以外,都一样的文件)
个人推荐用第一种。
一个源文件,.c ,.cpp等和它包含的文件一起,经过预处理以后形成一个源码文件,也即是编译单元(translation unit)包含一系列的声明和定义。
一个工程(program)由一个或多个编译单元组成。编译器将各个编译单元编译为目标代码(.obj),
通过链接器(linker)将这些编译后的编译单元(即目标代码)连接成完整的指令序列(可执行文件、动态库、静态库等)
声明和定义傻傻分不清。一般情况定义要为其对象分配或预留存储空间(例如类的成员函数的实现(定义)部分),而声明不用。声明只是告诉编译器,我有这个。
但是很多时候声明的同时也定义了。除了以下情况,声明就是定义
a.声明函数但不包括函数体;
b.声明包含extern链接限定符,例如:extern int a;
c.声明既没有初始化语法,也没有函数体;
d.类声明中声明静态数据成员;
e.类名字声明;
f.typedef声明;
g.using声明或者using指令;
最新的C++标准库中的一切内容都被放在名字空间std中(名字空间中的内容对外是不可见的),
但是带来了一个新问题,无数现有的C++代码都依赖于使用了多年的伪标准库中的功能,如声明在<iostream.h>;
等头文件中的功能,使用std包装标准库导致现有代码的不可用,为了兼容这种情况,
标准委员会为包装了std的那部分标准库创建了新的头文件,新的头文件的文件名与旧的一样,
只是没有.h这个后缀,如<iostream.h>;就变成了<iostream>;。对于C头文件,采用同样的方法,
但还在每个头文件名前加了字符c,如<string.h>;就变成了<cstring>;,<stdio.h>;变成了<cstdio>;。
最好使用新的文件头,使用新的文件头的C++程序,
“”包含的是项目根目录里的文件名或者带绝对路径的文件名(或者说“”包含的是带有文件名的字符串)。
包含的文件会替换掉#include<>或#include"",为了防止重复包含,在预处理中有两种方法:
1:宏 #ifndef _AAAA_H #define _AAAA_H #endif 这里用宏标记该文件已被用过,说明已经存在了一份副本,不在需要复制(便于移植,绝大多数编译器都支持。宏名不能冲突)
2:特定的编译指令 #pragma once 确保该文件只被编译一次(如果有多个相同的文件,会被编译多次。例如在工程里加了两份除文件名以外,都一样的文件)
个人推荐用第一种。
一个源文件,.c ,.cpp等和它包含的文件一起,经过预处理以后形成一个源码文件,也即是编译单元(translation unit)包含一系列的声明和定义。
一个工程(program)由一个或多个编译单元组成。编译器将各个编译单元编译为目标代码(.obj),
通过链接器(linker)将这些编译后的编译单元(即目标代码)连接成完整的指令序列(可执行文件、动态库、静态库等)
声明和定义傻傻分不清。一般情况定义要为其对象分配或预留存储空间(例如类的成员函数的实现(定义)部分),而声明不用。声明只是告诉编译器,我有这个。
但是很多时候声明的同时也定义了。除了以下情况,声明就是定义
a.声明函数但不包括函数体;
b.声明包含extern链接限定符,例如:extern int a;
c.声明既没有初始化语法,也没有函数体;
d.类声明中声明静态数据成员;
e.类名字声明;
f.typedef声明;
g.using声明或者using指令;
最新的C++标准库中的一切内容都被放在名字空间std中(名字空间中的内容对外是不可见的),
但是带来了一个新问题,无数现有的C++代码都依赖于使用了多年的伪标准库中的功能,如声明在<iostream.h>;
等头文件中的功能,使用std包装标准库导致现有代码的不可用,为了兼容这种情况,
标准委员会为包装了std的那部分标准库创建了新的头文件,新的头文件的文件名与旧的一样,
只是没有.h这个后缀,如<iostream.h>;就变成了<iostream>;。对于C头文件,采用同样的方法,
但还在每个头文件名前加了字符c,如<string.h>;就变成了<cstring>;,<stdio.h>;变成了<cstdio>;。
最好使用新的文件头,使用新的文件头的C++程序,
需要使用using namespace std或者using namespace std::指定的类名,等方法来使需要的类对于我们的代码可视。
个人整理的笔记,参考了百度百科等。