c++随笔之编译器编译原理
2016-11-03 13:08
127 查看
/*
C++编译器原理:
1)首先明白声明与定义是两个不同的概念
extern int i;是声明,int i;是定义
函数就更简单了
2)编译分为:
预编译:将宏替换,include等代码拷贝过来
编译:将代码转化为机怨言
链接:一般会对每个cpp文件生成.obj文件。下面会详细讲解
1>每个obj文件至少也该包含三个表:未知符号表,导出符号表,地址重定义表
未知符号表包含了每个cpp文件自身obj找不到函数或变量的定义的时候,该函数,变量的声明就被导入到未知符号表。
导出符号表包含了每个cpp文件变量,函数的定义,分为外部链接符号与内部链接符号。
地址重定向:将每个obj向exe文件地址进行编译,以确保外部链接的唯一性
2>连接器的工作过程:
首先他会将所有obj文件进行地址偏移,然后去访问所有obj文件的未知符号表,通过遍历导出符号表将未知符号表的符号的地址补充上
最后生成exe文件
3)每一个编译单元是独立的,不用担心声明为重复的问题,你应该担心定义是否会重复定义
4)一般的外部链接与内部链接符号的分类:
由外部链接的符号:默认的全局变量函数,类的成员变量函数。静态内部成员函数之所以在cpp文件定义就是担心他的重复定义问题,因为他是外部连接,被include多次,自然就会报外部符合重复冲突错误
内部链接的符号:static,const修饰的全局变量都是内部链接。
*/
C++编译器原理:
1)首先明白声明与定义是两个不同的概念
extern int i;是声明,int i;是定义
函数就更简单了
2)编译分为:
预编译:将宏替换,include等代码拷贝过来
编译:将代码转化为机怨言
链接:一般会对每个cpp文件生成.obj文件。下面会详细讲解
1>每个obj文件至少也该包含三个表:未知符号表,导出符号表,地址重定义表
未知符号表包含了每个cpp文件自身obj找不到函数或变量的定义的时候,该函数,变量的声明就被导入到未知符号表。
导出符号表包含了每个cpp文件变量,函数的定义,分为外部链接符号与内部链接符号。
地址重定向:将每个obj向exe文件地址进行编译,以确保外部链接的唯一性
2>连接器的工作过程:
首先他会将所有obj文件进行地址偏移,然后去访问所有obj文件的未知符号表,通过遍历导出符号表将未知符号表的符号的地址补充上
最后生成exe文件
3)每一个编译单元是独立的,不用担心声明为重复的问题,你应该担心定义是否会重复定义
4)一般的外部链接与内部链接符号的分类:
由外部链接的符号:默认的全局变量函数,类的成员变量函数。静态内部成员函数之所以在cpp文件定义就是担心他的重复定义问题,因为他是外部连接,被include多次,自然就会报外部符合重复冲突错误
内部链接的符号:static,const修饰的全局变量都是内部链接。
*/
相关文章推荐
- 关于Basic程序解释器及编译原理的简单化(2)---C++封装好的Basic解释器
- 关于Basic程序解释器及编译原理的简单化(2)---C++封装好的Basic解释器
- C++实现编译原理的词法分析器
- 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
- 编译原理--编译器的自举与移植
- 编译原理课程设计_C--编译器_语法分析&代码生成
- 压缩C++简单程序词法分析后的文件(编译原理实验)
- c++模板类(一)理解编译器的编译模板过程
- 经典面试题目--在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 设计有穷自动机DFA实现C++简单程序的词法分析、扫描(编译原理实验) 推荐
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?----转
- 在C++中调用被C编译器编译后的函数,为什么要加extern "C"
- 为什么c++程序调用c编译器编译的函数需要在调用前加上extern“C”
- 大家编译c/c++都用什么编译器呀?
- 编译原理第二章简单的一遍编译器
- 编译原理 编译器的实现(C语言实现)
- 链式队列的c++代码和原理以及编译分析
- 编译原理及实践教材TINY编译器代码解析
- 编译器编译原理详解