导航:首页 > 源码编译 > 预编译和第一遍编译

预编译和第一遍编译

发布时间:2024-12-26 16:48:06

编译和预编译有什么区别。

预编译又称为预处理,是做些代码文本的替换工作。

处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等

就是为编译做的预备工作的阶段

主要处理#开始的预编译指令
编译(compilation , compile) 1、利用编译程序从源语言编写的源程序产生目标程序的过程。 2、用编译程序产生目标程序的动作。 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。

❷ 编译的四个步骤:预编译、编译、汇编、链接

在执行命令g++ main.cpp -o main时,g++的背后隐藏着四个关键步骤:预编译、编译、汇编和链接。以下是这些步骤的详细过程:

首先,预编译阶段(Preprocessing)开始于g++ -E main.cpp -o main.i,其任务是处理C++代码中的预处理指令,如#include、#define等,这些指令会进行头文件引入、宏展开和注释删除等操作。

接着,编译阶段(Compiling)通过g++ -S main.i -o main.s,将预处理后的C/C++代码转化为汇编指令,这是由编译器进行的复杂过程,包括词法分析、语法分析和语义分析。

然后,汇编阶段(Assembling)通过g++ -c main.s -o main.o,将汇编指令进一步转化为二进制机器码,这个阶段的产物是可重用的对象文件。

最后,链接阶段(Linking)在g++ main.o -o main中完成,它将各个模块合并,查找并链接外部依赖,生成可执行文件。链接过程又分为静态链接和动态链接:静态链接将所有依赖打包到最终文件中,体积较大但无需额外库;动态链接则在运行时动态加载库,文件较小,但需要与库文件一起发布。

❸ c语言一次完成编译、连接和执行用什么键

C/C++语言的完整编译过程是 一、预编译 处理#define #if #include这类#开头的语句,这些称为预编译指令。这个过程中会把.h文件和.c/.cpp文件组合成最终交给compile过程的原文件。这个原文件是不包含任何#开头的语句的。所有#define定义的宏也会被替换。 二、编译把上面那个原文件编译成.o或者VC里是.obj文件。这个文件保存了机器码化的函数、函数的描述、全局变量的描述、乃至段的描述等等。 三、连接把可执行程序需要的所有的编译过程产生的.o或者.obj文件组合到一起。(这里也包括.lib文件,.lib文件件本质上就是打包的.obj文件集合)。另外连接过程还会组合一些其他数据,比如资源、可执行文件头等等。

❹ c语言中,以"#"开头的控制行都是预处理命令吗

对的。
预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置。
预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。
C语言提供多种预处理功能,主要处理#开始的预编译指令,如宏定义(#define)、文件包含(#include)、条件编译(#ifdef)等。合理使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。

❺ C语言源程序的编译过程包括哪三个阶段

编译:将源程序转换为扩展名为.obj的二进制代码
连接:将obj文件进行连接,加入库函数等生成可执行文件
运行:执行可执行文件,有错返回修改,无错结束

❻ 什么是预编译,何时需要预编译

预编译又称为预处理,是做些代码文本的替换工作

预编译又称为预处理,是做些代码文本的替换工作

处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等

就是为编译做的预备工作的阶段

主要处理#开始的预编译指令

预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。常见的预编译指令有:

(1)#include 指令

该指令指示编译器将xxx.xxx文件的全部内容插入此处。若用<>括起文件则在系统的INCLUDE目录中寻找文件,若用" "括起文件则在当前目录中寻找文件。一般来说,该文件是后缀名为"h"或"cpp"的头文件。

注意:<>不会在当前目录下搜索头文件,如果我们不用<>而用""把头文件名扩起,其意义为在先在当前目录下搜索头文件,再在系统默认目录下搜索。

(2)#define指令

该指令有三种用法:

第一种是定义标识,标识有效范围为整个程序,形如#define XXX,常与#if配合使用;

第二种是定义常数,如#define max 100,则max代表100(这种情况下使用const定义常数更好,原因见注1);

第三种是定义"函数",如#define get_max(a, b) ((a)>(b)?(a):(b)) 则以后使用get_max(x,y)就可以得到x和y中较大的数(这种方法存在一些弊病,见注2)。

第四种是定义"宏函数",如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用时,用GEN_FUN(int),则此处预编译后就变成了 max_int(int a,int b){return a>b?a:b;},以后就可以使用max_int(x,y)就可以得到x和y中较大的数.比第三种,增加了类型的说明。

(3)#if、#else和#endif指令

这些指令一般这样配合使用:

#if defined(标识) //如果定义了标识

要执行的指令

#else

要执行的指令

#endif

在头文件中为了避免重复调用(比如说两个头文件互相包含对方),常采用这样的结构:

#if !(defined XXX) //XXX为一个在你的程序中唯一的标识符,

//每个头文件的标识符都不应相同。

//起标识符的常见方法是若头文件名为"abc.h"

//则标识为"abc_h"

#define XXX

真正的内容,如函数声明之类

#endif

阅读全文

与预编译和第一遍编译相关的资料

热点内容
灵魂app是哪里的 浏览:222
云听app客服在哪里 浏览:575
xss过滤java 浏览:661
dvdmark文件夹 浏览:207
广联达组价需要加密狗吗 浏览:352
挂载分区命令 浏览:916
phpfpm的作用 浏览:653
填pdf表格 浏览:526
腾讯云渲染服务器 浏览:310
php内置异常 浏览:277
androidauto语音 浏览:55
云缴费app兑换码在哪里 浏览:625
圣地安列斯安卓版存档怎么用 浏览:201
在哪里可以找到旧版本的app 浏览:373
一个客户端如何连接多个服务器 浏览:883
短信加密的作用 浏览:108
微型高压空气压缩机 浏览:520
微信app如何翻译视频 浏览:860
考试前听什么歌解压 浏览:474
哪个app充值可以用银联二维码 浏览:566