当前位置:首页 » 编程软件 » 编译预处理有几种

编译预处理有几种

发布时间: 2025-03-01 17:31:18

A. include<stdi.h>是正确的编译预处理命令吗

不是。
程序设计语言的预处理的概念:在编译之前进行的处理。c语言的预处理主要有三个方面的内容:1.宏定义;2.文件包含;3.条件编译。预处理命令以符号#开头。
编译时以包含处理以后的文件为编译单位,被包含的文件是源文件的一部分。
编译以后只得到一个目标文件.obj。
被包含的文件又被称为标题文件或头部文件、头文件,并且常用.h作扩展名。
修改头文件后所有包含该文件的文件都要重新编译。
头文件的内容除了函数原型和宏定义外,还可以有结构体定义,全局变量定义。

B. C语言中条件编译的作用

条件编译属于三种宏定义中的一种,条件指示符的最主要目的是防止头文件的重复包含和编译,例如:一个c文件包含同一个h文件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误


条件编译常用的有四个预处理命令:#if、#else、#elif、#endif。

#if指令的形式为:

#if常量表达式
代码块
#endif

#if后面的常量表达式为值,则编译它与#endif之间的代码,否则跳过这些代码。指令#endif标识一个#if块的结束。


#else被使用来标志#if的末尾和#else块的开始。这是必须的,因为任何#if仅有一个#endif与之关联。


#elif意指"else if",它形成一个if else if嵌套语句用于多种编译选择。#elif后面跟一个常量表达式,如果表达式是真,则编译其后的代码块,不对其他#elif表达式进行检测,否则顺序测试下一块。常见的形式如下:

形式1:

#ifdef标识符
/*程序段1*/
#else
/*程序段2*/
#endif

它的作用是当标识符已经由#define定义过了,则编译程序段1,否则编译程序段2,也可以使用简单形式

#ifdef标识符
/*程序段1*/
#endif

形式2:

#ifndef标识符
#define标识符
/*程序段1*/
#else
/*程序段2*/
#endif

它的作用是当标识符没有由#define定义过,则编译程序段1,否则编译程序段2 ,也可以使用简单形式

#ifndef标识符
#define标识符
/*程序段1*/
#endif

形式3:

#if表达式
/*程序段1*/
#else
*程序段2*/
#endif

它的作用是 当“表达式”值为真时编译程序段1。否则则编译程序段2,也可以使用简单形式

#if表达式
/*程序段1*/
#endif

形式4:

#if表达式1
/*程序段1*/
#elif表达式2
/*程序段2*/
............
#elif表达式n
/*程序段n*/
#endif

它的作用是当“表达式1”值为1时编译程序段1,表达式2的值为真是编译程序段2,否则依次顺序判断到表达式n。


最后,条件编译的条件是一个常量表达式,支持逻辑与&&和或||运算。以上四种形式的条件编译预处理结构都可以嵌套使用,

标识符: 在理论上来说可以是自由命名的,但每个头文件的这个标识符都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h。

#ifndef_STDIO_H_
#define_STDIO_H_
/*程序段*/
#endif

C. c语言中预处理命令都有哪些

C语言的预处理主要有三个方面的内容: 1.宏定义; 2.文件包含; 3.条件编译。x0dx0a 预处理命令以符号“#”开头。x0dx0ax0dx0a宏定义命令:#define、#undef,用来定义和解除宏。(值得注意的是还可以定义带参数的宏)x0dx0ax0dx0a文件包含命令:#include "文件名" 或者 #include <文件名>。使用前者时会优先从当前目录查找头文件,使用后者时优先从默认的系统目录查找。x0dx0ax0dx0a条件编译:#ifdef、#else、#endif、#elif 等。出于程序兼容性的考虑,有些语句希望在条件满足时才编译。这时候会用到条件编译的命令。

D. 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源程序的名称。预编译程序对于在源程序中出现的这些串将用合适的值进行替换。

注意:

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

E. c语言入门 第十九章 预处理指令

c语言程序从代码到可执行的程序,中间要经过几个阶段,大部分的过程都会由编译器自动完成,这里我们只介绍和我们写代码有关的部分,就是预处理。

预处理,就是在编译之前,对代码进行的处理。我们经常使用的预处理指令大概可以分成三类。

第一类是包含文件,我们在之前写的代码当中,第一句话就是 #include "...",这就是一个典型的预处理命令,作用就是 在编译代码之前,把另外一个源文件当中的内容引入到当前的c文件中。例如引入 stdio.h 这个头文件,提供了一系列的函数,如printf和scanf。

第二类是宏定义,宏定义可以在预处理阶段,对代码的文本内容进行替换。#define 宏名 替换内容,在编译之前,会把代码当中的宏定义内容,对代码的内容进行整理。宏定义和变量定义最大的区别就是,宏定义只是在代码编译之前,对代码的当中出现的宏进行文本替换,而变量的定义是在代码编译之后,执行的过程当中创建。例如,变量代表了一个内存地址,可以去修改内存地址的值。而宏定义只是简单的对代码进行文本替换,这样写程序就会出错,因为在编译之前程序就会被替换处理为a+=1中a直接被10替换了,语句就变成了10+=1,这很显然就是错的。在写代码的时候,我们为了和变量进行区分,宏定义通常都使用大写字母。宏定义的替换一般我们称作宏展开。宏定义还可以使用类似函数的参数的形式,#define 宏(参数,...) 替换内容。这样写程序就会得到正确的结果。

第三类是条件编译,预处理当中的第三部分内容就是可以对程序进行有条件的编译。例如,假如我们需要写一个能够在多个平台都能够执行的程序,那么在不同平台上引入的头文件,和库函数可能并不相同,那就需要我们根据具体的平台,来选择性的编译代码。条件编译使用的指令有 #if,#ifdef,#ifndef,#elif,#else,#endif 用法和if...else语句类似,常用的结构是。

除了以上几种之外,还有其他的一些预处理指令,例如 #pragma,#error,#line等等,具体的内容可以查看c语言的手册。

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

热点内容
绕ID脚本 发布:2025-03-01 20:13:47 浏览:890
艾希安卓手机哪里买 发布:2025-03-01 20:13:47 浏览:303
44算法 发布:2025-03-01 20:12:48 浏览:343
qq里面存储的密码在哪里 发布:2025-03-01 20:08:28 浏览:864
php自动完成 发布:2025-03-01 20:04:20 浏览:624
axel源码 发布:2025-03-01 19:52:17 浏览:225
小学加减混合运算法则 发布:2025-03-01 19:25:50 浏览:960
我的世界好玩的自创服务器 发布:2025-03-01 19:16:31 浏览:952
密码锁一直在闪是什么情况 发布:2025-03-01 19:09:21 浏览:270
宝马app插件怎么到安卓桌面 发布:2025-03-01 19:09:19 浏览:996