导航:首页 > 源码编译 > 预编译阶段执行指令

预编译阶段执行指令

发布时间:2025-02-18 16:33:25

A. 什么是预编译,何时需要预编译

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

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

处理#开头的指令,比如拷贝#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

B. C语言文件的编译与执行的四个阶段并分别描述

开发C程序有四个步骤:编辑、编译、连接和运行。

任何一个体系结构处理器上都可以使用C语言程序,只要该体系结构处理器有相应的C语言编译器和库,那么C源代码就可以编译并连接到目标二进制文件上运行。

1、预处理:导入源程序并保存(C文件)。

2、编译:将源程序转换为目标文件(Obj文件)。

3、链接:将目标文件生成为可执行文件(EXE文件)。

4、运行:执行,获取运行结果的EXE文件。

(2)预编译阶段执行指令扩展阅读:

将C语言代码分为程序的几个阶段:

1、首先,源代码文件测试。以及相关的头文件,比如stdio。H、由预处理器CPP预处理为.I文件。预编译的。文件不包含任何宏定义,因为所有宏都已展开,并且包含的文件已插入。我归档。

2、编译过程是对预处理文件进行词法分析、语法分析、语义分析和优化,生成相应的汇编代码文件。这个过程往往是整个程序的核心部分,也是最复杂的部分之一。

3、汇编程序不直接输出可执行文件,而是输出目标文件。汇编程序可以调用LD来生成可以运行的可执行程序。也就是说,您需要链接大量的文件才能获得“a.out”,即最终的可执行文件。

4、在链接过程中,需要重新调整其他目标文件中定义的函数调用指令,而其他目标文件中定义的变量也存在同样的问题。

C. c语言 #if 和if的区别

有区友如春别,#if 是预编译。#if如果不橡哪是真的好耐话, 其后面的代码是不会被编译的。跟#ifdef 差不多,只是#if后面跟的是条件,而 #ifdef后面跟的是一个宏,判断其是否定义。

D. C++中if、#if与#ifdef、#ifndef彼此的区别

1、意义不同

#开头的都是预编译指令,就是在正式编译之前,编译器做一些预处理的工作
,所以说#if与#ifdef、#ifndef都是,而if是判断语句,不是预编译指令。

2、用法

if是条件语句,在运行的过程中根据条件的值选择执行不同的语句。

#if是条件编译语句,在编译阶段执行,如果后面跟的条件成立,就编译对应的语句。

#ifdef是条件编译语句,在编译阶段执行,后面跟一个宏的名称,如果这个宏已经定义了,就编译对应的语句。

#ifndef是条件编译语句,在编译阶段执行,后面跟一个宏的名称,如果这个宏没有定义,就编译对应的语句。

(4)预编译阶段执行指令扩展阅读:

C++中if、#if与#ifdef、#ifndef的具体使用方法

一、#ifdef 和 #ifndef 指令 (C/C++)

只要能够使用 #if,就可以使用 #ifdef 和 #ifndef 指令,在定义 identifier 时,#ifdef identifier 语句与 #if 1 等效,当 identifier 未定义或没有使用 #undef 指令进行定义时,该语句与 #if 0 等效。

这些指令只检查使用 #define 定义的标识符是否存在,而不检查在 C 或 C++ 源代码中声明的标识符。

提供这些指令只是为了实现与该语言的早期版本的兼容性。 优先选择将 defined( identifier ) 常量表达式与 #if 指令一起使用。

#ifndef 指令检查 #ifdef 所检查的条件的相反值。 如果尚未定义标识符(或已使用 #undef 移除其定义),则条件为 true(非零)。 否则,条件为 false (0)。

二、#if :

源文件中的每个#if指令必须与表示结束的 #endif指令匹配,任意数量的 #elif指令可以出现在 #if 和 #endif指令之间。

但最多允许一个 #else 指令,且 #else指令(如果有)必须是#endif之前的最后一个指令。

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

在执行命令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中完成,它将各个模块合并,查找并链接外部依赖,生成可执行文件。链接过程又分为静态链接和动态链接:静态链接将所有依赖打包到最终文件中,体积较大但无需额外库;动态链接则在运行时动态加载库,文件较小,但需要与库文件一起发布。

F. C++ if()是不是条件编译指令

if()属于判断语句,不是条件编译指令。
与if类似的条件编译指令为#if和#ifdef。

条件编译指令属于预编译语句,即编译器在执行编译工作时,会第一步处理预编译语句,之后再进行剩余的编译工作。
在C语言中,所有的预编译语句都是以#开头的,如#define, #undef,#if等等。
条件编译指令包括以下几项:
1 #if
当后续的参数为真时执行编译。
2 #ifdef/#ifndef
#ifdef当后续的宏定义被定义时执行编译。
#ifndef当后续的宏定义没有被定义时执行编译。
3 #elif
与C语言语句中的else if类似,与#if或#ifdef连用,当后续参数为真时执行编译。
4 #endif
用于条件编译结尾,表示条件编译结束。

阅读全文

与预编译阶段执行指令相关的资料

热点内容
中国现代编译器 浏览:849
如何得到app专栏 浏览:451
魔兽世界日本服务器什么职业多 浏览:729
表格加密怎么设置只读模式打开 浏览:882
哪个app可以不用花呗分期 浏览:859
SSL是对称加密吗 浏览:45
捷途app钥匙怎么用 浏览:959
享省油app怎么在加油站使用 浏览:250
crc算法的实现c语言 浏览:187
风光摄影pdf 浏览:938
头部按摩器可以缓解压力吗 浏览:651
格式工厂压缩图片大小 浏览:892
程序员的黑科技视频 浏览:297
加密字段表格显示 浏览:404
pdf打印缺字 浏览:516
安卓手机锁住图标用什么app 浏览:291
程序员牧师 浏览:459
影音服务器是什么意思 浏览:859
安卓如何合入补丁 浏览:932
文件夹中的应用隐藏怎么办 浏览:470