编译器编译过程的理解

编译过程大体包括预处理,编译,汇编,链接四大步,其中预处理主要是宏定义替换,文件包含,条件编译。用#ifndef机构可以防止以下情况:即一个文件A包含了一个头文件C,同时另一个文件B也包含了头文件C,而且文件A包含了头文件B,若用#ifndef结构可以避免在编译的时候报错,但是若头文件里有定义(包括函数,数组,变量)那么在链接的时候会因为多个object包含同一对象而报错,此错误是链接时的错误非编译错误,所以必须注意的是,在头文件里面只能声明,不能定义。另外注意的是include后尖括号和双引号的区别,尖括号则告诉编译器先从软件安装时已经包含的库中找头文件,双引号则告诉编译器先从制定目录下寻找头文件。编译是将预处理的结果转化为汇编语言,而汇编的结果是翻译成机器码,链接是将各部分功能实现合成一个可执行文件,这里就牵涉到库的概念。

编译器编译过程的理解

时间: 2024-08-12 08:50:05

编译器编译过程的理解的相关文章

c++程序编译过程的理解

在程序进行编译的是,先对所有的预处理命令进行处理,将头文件的具体内容代替#include命令行,然后在对该程序单元进行整体的编译.   using namespace std;  //"使用命令空间 std". c++标准库中的类和函数是在命名空间std中声明的,因此程序中如果需要用到C++标准库(此时就需要用到#include命令行) 求a和b,2个数之和???????????? //求2个数之和 #include <iostream>        //预处理命名 us

pbcpbc-0.5.12 使用arm编译器编译 过程中出现extend_printf.c中错误,需要替换extend_printf.c文件

下面是国外网站搜索结果 Zhi Guan  3/27/12 Hi, I build pbc on Mac OS X 10.7 with Android NDK r7b. There are two problem: 1) ./configure --host=arm-linux-androideabi  Stopped, when change the ./config.sub ./config.guess, it passed. 2) ./make will stopped with the

一个空类被编译器编译后产生了哪些默认函数

为何空类的大小不是0呢? 为了确保两个不同对象的地址不同,必须如此. 类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的二地址. 同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了. 所以,空类的sizeof为1,而不是0. 一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function, 如果你写 class A{}; 编译器处理后,就相当于: class A { public: A()

转载 关于编译器的编译过程

调试的问题出现这个问题还蛮奇怪的,a.h需包含statistic.h, main.c需包含a.h和statistic.h,导致了statistic.h重复包含,hsdm_queue_ctr重复定义. 关于重复包含和重复定义的问题,可根据下面的分析得到认识. 为什么用了宏名字定义检测头文件的重复包含可还是有重复定义的错误? 我在一个头文件中定义了一个函数F, 整个头文件用:#ifndef _XXX#define _XXX...#endif括起来以避免重复包含. 然后有两个Cpp文件都包含了这个头文

c++编译过程理解

1.Makefile就知道了.先直接用命令行操作,然后用集成的IDE来写代码. 2.对于编译过程,总体上是这样 <1>源代码(*.h,*.cpp/c)经过预编译,编译,生成目标文件(Windows下应该是.obj文件,Linux/unix下是.o文件) <2>然后通过链接(将各种目标文件.obj(.o) 和 目标文件的集合(动态静态库dll(windows下),so(linux/unix下))) <3>最终成功可执行文件(Windows下叫exe,Linux/unix下

C语言的编译过程、安装gcc编译器以及设置环境变量

以我对C语言编译过程的了解,我用了一点时间画了一个图,提供给大家参考一下,希望有些能对您的问题提上帮助. 前几天刚初步学习了C语言的编译过程,感触挺深的.在C语言中头文件其实起了一个很大的作用. 1.头文件可以不需要编译 2.可以查看具体的声明 3.头文件加上实现文件的o文件提交给使用者即可 ,不需要知道源代码 4..o文件预先编译,所以整个项目编译时,会大大提高编译的时间 . 5.当一个文件(A.c文件)依赖于头文件(b.h)时 ,如果b.c编译之后形成的b.o文件重新编译后,a.o的文件不需

GCC编译器原理(三)------编译原理三:编译过程---预处理

Gcc的编译流程分为了四个步骤: 预处理,生成预编译文件(.文件):gcc –E hello.c –o hello.i 编译,生成汇编代码(.s文件):gcc –S hello.i –o hello.s 汇编,生成目标文件(.o文件):gcc –c hello.s –o hello.o 链接,生成可执行文件:gcc hello.o –o hello 一.预处理 预编译程序读出源代码,对其中内嵌的指示字进行响应,产生源代码的修改版本,修改后的版本会被编译程序读入. 在 GNU 术语中,预处理程序叫

C语言程序编译过程

最近在编译DM8168的ARM端程序时经常出现未定义.重定义等报错,由于源码文件多,包含关系比较多,所以自己添加时容易乱.深深的体会到,好的代码风格是如此重要,之前也在看代码重构,以后应该更加注意代码的质量.经思考总结规律如下: 1.公用的数据结构等写为一个头文件,其他源文件包含此头文件.同时为了让不同源文件里的函数都可以使用,公用的函数可以放在此头文件中声明. 2.其他源文件里声明的变量,如果想在另一个文件里用,需要extern声明,这样可以避免各种全局变量的交互混杂. 理解的比较浅,希望高人

VC++ 编译过程

一 前言 以前在编译C++代码的时候对编译的错误都觉得很难理解,搞不清楚究竟是哪里错了.后来C++写多了,总结了一些经验,然后也了解了一下编译过程,但是没有系统的对编译过程进行学习,现在趁着写博客的机会,好好的把编译过程写下来,并且理顺一下这个知识点. 二 名词解释 编译单元:当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有 必要信息的单个源文件,这个源文件就是一个编译单元. 目标文件:目标文件包含着机器代码(可直接被计算机中央处理器执行)以及代码在运行时使用的数据,此