C++常见问题

来源:互联网 发布:阿里云邮箱如何添加 编辑:程序博客网 时间:2024/06/11 19:47

整理一下我碰见过的C++常见问题,会不断编辑更新:

1. 预处理

预处理的主要作用就是对资源进行等价替换,最常见的预处理有:文件包含(#include ),条件编译(#if,#ifndef,#ifdef,#endif,#undef),布局控制(#pragma),宏替换等(#define)等。

1.1 头文件中放什么?

头文件一般用于类的定义、extern变量和函数的声明。由于头文件可能被包含在多个源文件中,所以不应该含有变量定义或函数的定义。比如不要将这样的定义:

extern int a = 10;   //有初始化,相当于定义。const int a = 10;    //可以,但是最好将其定义到原文件中,然后用 extern int a;  引入。int a;               //将其定义到原文件中,然后用 extern int a;  引入。

1.2 #include如何工作?

预处理时用头文件里的内容替换每一个#include的地方。所以需要用头文件保护符(#ifndef ...  #define ... #endif)以防止多重包含。<>中的头文件表示标准头文件,查找时开始于预定义的位置;""中的头文件是非系统文件,查找时开始于源文件所在路径。

2. 编译连接

编译连接是编译器的事情,但应该知道这个过程都做了些什么。(以下过程为转抄,我觉得不是说的很清楚

首先是预编译,由cpp完成。将c和cpp文件转为*.i文件。 

然后是编译过程,由cc完成。文件是基本的编译单元,编译后将生成由带变量的汇编语句组成的*.s文件。

之后是汇编过程,由汇编器as完成。生成*.o/*.obj文件,其实就是可重定位的连接格式文件。

最后是连接过程,由用ld/link完成。主要任务是符号匹配和重定位符号,生成可执行文件。

3. C++基础知识