导航:首页 > 源码编译 > 预编译和预处理语句

预编译和预处理语句

发布时间:2023-11-10 16:39:18

A. #if #endif 是什么意思啊

#ifdef #endif是C语言的条件编译

条件编译是根据实际定义宏(某类条件)进行代码静态编译的手段。可根据表达式的值或某个特定宏是否被定义来确定编译条件。

如下面的例子:

#ifdef 标志符

程序段1

#else

程序段2

#endif

当定义了标志符则对程序段1进行编译,而没有定义标志符时则编译程序段2。

(1)预编译和预处理语句扩展阅读

条件编译的作用

条件编译跟事物具有多样性一样。我们需要对不同的状况下采取不同的操作。例如程序的运行平台具有这种多样性,我们在window平台下编写的程序,可能使用某一个库或者与硬件相关的属性、方法。

现在要将我们的程序移植到别的计算机系统的时候,例如Linux系统。那么程序上依赖的库或者有些和硬件相关联的属性和方法不得不更改,那么我们只能在编写程序的时候提高程序的健壮性,此时就需要条件编译语句为我们实现这样的功能。

B. c语言编译预处理

编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。

如果用一张图来表示:

读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理

[析] 伪指令主要包括以下四个方面

(1)宏定义指令,如#define Name TokenString,#undef等。对于前一个伪指令,预编译所要做的是将程序中的所有Name用TokenString替换,但作为字符串常量的Name则不被替换。对于后者,则将取消对某个宏的定义,使以后该串的'出现不再被替换。

(2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉

(3)头文件包含指令,如#include "FileName"或者#include 等。在头文件中一般用伪指令#define定义了大量的宏(最常见的是字符常量),同时包含有各种外部符号的声明。采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用。因为在需要用到这些定义的C源程序中,只需加上一条#include语句即可,而不必再在此文件中将这些定义重复一遍。预编译程序将把头文件中的定义统统都加入到它所产生的输出文件中,以供编译程序对之进行处理。

包含到c源程序中的头文件可以是系统提供的,这些头文件一般被放在/usr/include目录下。在程序中#include它们要使用尖括号(<>)。另外开发人员也可以定义自己的头文件,这些文件一般与c源程序放在同一目录下,此时在#include中要用双引号("")。

(4)特殊符号,预编译程序可以识别一些特殊的符号。例如在源程序中出现的LINE标识将被解释为当前行号(十进制数),FILE则被解释为当前被编译的C源程序的名称。预编译程序对于在源程序中出现的这些串将用合适的值进行替换。

注意:

预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。

C. c语言程序,预编译的作用是什么

预编译又称为预处理 , 是做些代码文本的替换工作。
处理 # 开头的指令 ,
比如拷贝 #include 包含的文件代码,
#define 宏定义的替换 , 条件编译等,
就是为编译做的预备工作的阶段,主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。
c 编译系统在对程序进行通常的编译之前,先进行预处理。 c 提供的预处理功能主要有以下三 种:
1)宏定义 #definemin(a,b)((a)>(b)?(b)::(a))
2 )文件包含 如:#include<stdio.h>
3 )条件编译#ifndefGRAPHICS_H
#defineGRAPHICS_H
*****
#endif

#ifdefGRAPHICS_H
*****
#else
*****
#endif

D. C语言程序中的#include和#define均不是C语句。 对还是错的啊

C语言程序中的#include和#define均不是C语句。是对的。

#include是在程序编译之前要处理的内容,称为编译预处理命令。#define是C语言中的一个预处理指令,其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令,“define”为宏定义命令,用于将指定头文件嵌入源文件中。

它们都以“#”开头,不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。所以不是c语言的程序语句。

(4)预编译和预处理语句扩展阅读:

#include后面有两种方式,<>;和""前者先在标准库中查找,查找不到在path中查找。后者为文件路径,若直接是文件名则在项目根目录下查找。

在#define中,是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。

E. C语言提供的预编译处理命令主要有哪三种

1.宏定义:用一个指定的标识符(即名字)来代表一个字符串,如:用PI代表3.1415926,#define PI 3.1415926
2.文件包含:指一个源文件可以将另外一个源文件的全部内容包含进来,#include<文件名>
3.条件编译:对一部分内容指定编译的条件,即满足一定的条件才编译,主要有:
(1)#ifdef标识符
程序段1
#eles
程序段2
#endif
(2)#ifndef标识符
程序段1
#eles
程序段2
#endif
(3))#if标识符
程序段1
#eles
程序段2
#endif

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

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

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

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

G. 什么是GCCGCC有什么作用

GCC(GNUCompilerCollection,GNU编译器套件),是由GNU开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是GNU计划的关键部分。

GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、MacOSX等)采纳为标准的编译器,GCC同样适用于微软的Windows。GCC是自由软件过程发展中的着名例子,由自由软件基金会以GPL协议发布。

GCC功能与作用:

1、预处理

命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。

2、编译

用GCC编译C/C++代码时,它会试着用最少的时间完成编译并且编译后的代码易于调试。易于调试意味着编译后的代码与源代码有同样的执行顺序,编译后的代码没有经过优化。

3、连接

当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。

4、汇编

汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。

(7)预编译和预处理语句扩展阅读:

gcc所遵循的部分约定规则:

1、.c为后缀的文件,C语言源代码文件。

2、.a为后缀的文件,卖散是洞庆由目标文件构成的档案库文件。

3、.h为后缀的文件,是程序所包含的头文件。

4、.i为后缀的文件,是C源代码文件且不应该对其执行预处理。

5、.m为后缀的文件,是Objective-C源代码文件。

6、.o为后缀的文件,是编译后的目标文件。

7、.s为后缀的文件,是汇编语言源代码文件。

阅读全文

与预编译和预处理语句相关的资料

热点内容
反诈骗app怎么找回密码 浏览:631
java方法和函数 浏览:420
程序员衣服穿反 浏览:959
java多类继承 浏览:159
怎么用多玩我的世界连接服务器地址 浏览:483
为什么华为手机比安卓流畅 浏览:177
javamap多线程 浏览:228
卡西欧app怎么改时间 浏览:843
jquery压缩图片 浏览:970
用纸筒做解压东西 浏览:238
神奇宝贝服务器如何tp 浏览:244
云服务器支持退货吗 浏览:277
贷款等额本息算法 浏览:190
根服务器地址配置 浏览:501
单片机是软件还是硬件 浏览:624
vivo手机怎么看编译编号 浏览:320
塑钢扣条算法 浏览:301
linux应用程序安装 浏览:414
linux怎么查找命令 浏览:431
安卓12原生和非原生是什么意思 浏览:277