精华内容
下载资源
问答
  • 编译预处理

    2018-03-24 10:43:21
    编译预处理PPT
  • 编译预处理 C语言的编译预处理功能主要包括:文件包括(#include)、宏定义(#define)、条件编译 编译预处理是C语言编译程序的组成部分,用于解释处理C语言源程序种的各种预处理指令,形式上都以#开头不属于C语言种...

    编译预处理

    C语言的编译预处理功能主要包括:文件包括(#include)、宏定义(#define)、条件编译

    • 编译预处理是C语言编译程序的组成部分,用于解释处理C语言源程序种的各种预处理指令,形式上都以#开头不属于C语言种真正的语句,但增强了C语言的编程功能,提高编程效率,C程序的编译处理用于把每一条C语句用若干条机器指令来实现,生成目标程序。由于#define等编译预处理指令不是语句,不能被编译程序翻译,需要在真正编译之前做一个预处理,解释完成编译预处理指令,从而把预处理指令转换成相应的C程序段,最终称为由纯粹C语句构成的程序,经编译后得到目标代码。
    • 所有编译预处理指令都在百衲衣预处理步骤中起作用,与程序真正运行过程无关。

    宏基本定义

    • #define 宏名 宏定义字符串 (宏定义要在一行之内完成)如果一行之内完成不了,可以跟一个“\”符号表示改行未结束,与下一行合起来完成完整一行
    • 上述宏定义语句以#开始,表示它在编译预处理种起作用,而不是真正的C语句,行尾无需分号
    #define PI 3.1415926
    #define TRUE true
    #define LONG_STRING "It represent a long string that \
    is used as an example."
    printf(LONG_STRING);

    带参数的宏定义

    • 宏替换在程序编译预处理时完成,对于MAX(x,y)的编译预处理,首先用变量名x和y分别替换a,b,然后再用包含x,y的条件表达式替换MAX编译结束后,程序种MAX(x,y)便消失。
    • 在进行宏定义的时候注意对参数使用括号,因为宏替换仅仅是简单的替换,如果用两个参数eg:a+b替换为x的话可能产生歧义,当main种x=SQR(x+y)进行宏替换之后的结果可能不是人们想要的,结果是:x=x+yx+y;而人们想要的结果是x=(x+y)(x+y),要避免产生这种问题就要在进行宏定义的时候将原来的:
    #define SQR(x) x*x改成#define SQR(x) (x)*(x)
    
    #include<stdio.h>
    #define MAX(a,b) a>b?a:b;
    #define SQR(x) x*x
    int main(){
        int x,y;
        scanf("%d%d",&x,&y);
        x=MAX(x,y);
        y=SQR(x);
        printf("%d %d",x,y);
        return 0;
    }

    文件包含

    • 文件包含的作用是把指定的文件模板内容插入到#include所在的位置,当程序编译连接时,系统会把所有的#include指定的文件凭借生产可执行代码,文件包含必须以#开头,这表示编译预处理命令,它将在程序编译时起作用,把指定的文件模块包含进来,当经过生成可执行代码后,include便不再存在,因此include不是真正的C语句,行尾不用分号结束
    • 文件包含的个格式:#incldue<需包含的文件名>或include "需包含的文件名"
    • 文件包含种指定的文件名如果使用尖括号<>,将使用C语言的便准头文件,由编译程序到C系统种设置好的include文件夹种把指定的文件包含进来,如果使用双引号“”,则编译程序首先到当前工作文件夹寻找被包含的文件,若找不到,再到系统include文件夹种查找文件,一般适用于编程者直接的包含文件,需要时可以在文件名前加上所在的路径。

    条件编译

    如果指向把源程序种一部分语句生成母便代码,可以使用条件编译。

    #define FLAG 1
    #if FLAG
    	程序段1
    #else
    	程序段2
    #endif	
    • 程序段1和2只有一个会被生成到目标程序种,这里FLAG被定义为1,所以会将第一个程序段编译;
    • 条件编译指令均以#开头,其意义与C语言的if-else语句完全不同,C语句if-else的两个分支程序段都会被生成到目标程序种,有程序运行时根据条件决定执行哪一段,而条件编译#if…#else…#endif不仅形式不同,而且它起作用的事可在编译与出口i的时候,一旦经过处理后,只有一段程序生成到目标程序种,另一段被舍弃。#if的条件只能起宏明,不能是程序表达式,因为在编译预处理时是无法计算表达式的,必须在程序运行时才做计算。
    展开全文
  • C语言编译预处理 编 译 预 处 理 命 令 1 编译预处理编译预处理 v C语言编译系统的一个组成部分。是指编译前由编译系 统中的预处理程序对源程序的预处理命令进行加工。C 程序的源代码中的编译预处理命令不是C语言的...

    41528d3028836879cd698677c3999917.gifC语言编译预处理

    编 译 预 处 理 命 令 1 编译预处理编译预处理 v C语言编译系统的一个组成部分。是指编译前由编译系 统中的预处理程序对源程序的预处理命令进行加工。C 程序的源代码中的编译预处理命令不是C语言的一部分 更不是C语句,但它扩展了C程序设计的环境。 v C语言的预处理命令均以“#”打头,末尾不加分号,以区 别于一般的C语句,其作用域是出现点到源程序文件的 末尾。 v C程序提供的预处理功能有三种: Ø 宏定义(宏替换) Ø 文件包含 Ø 条件编译。 第9章 编译预处理命令 编 译 预 处 理 命 令 2 1. 不带参数的宏定义 用一个指定的标识符来代表一个字符串,它的一般形式 为: #define 标识符 字符串 这种方法使用户能以一个简单的名字代替一个长的字符 串,因此把这个标识符称为宏名宏名,在预编译时将宏名替换成 字符串的过程称为宏展开宏展开。 « 宏定义 #define PI 3.1415926 void main() { float l,s,r,v; printf(“ radius :“); scanf(“%f“, l=2.0*PI*r; s=PI*r*r; v=4.0/3*PI*r*r*r; printf(“l=%10.4f\ns=%10.4f\nv=%10.4f\n“, l,s,v); } 编 译 预 处 理 命 令 3 说明: 1.宏名一般习惯用大写字母表示,以与变量名区别。 2.使用宏名代替一个字符串,可以减少程序中重复书写 某些字符串的工作量,还可提高程序的可移植性。 3.宏定义是用宏名代替一个字符串,也就是作简单的置 换,不作语法检查。 4.宏定义不是C语句,不要在行末加分号。 5.#define命令中的宏名的有效范围为定义命令之后 到本源文件结束。 6.可以用#undef命令终止宏定义的作用域。 #undef 宏名 7.在进行宏定义时,可以引用已定义的宏名,可以层 层置换。 8.对程序中用双引号括起来的字符串内的字符不进行 置换。 #define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define S PI*R*R #include void main() { printf(“L=%f\nS=%f\n“,L,S); } printf(“L=%f\nS=%f\n“, 2*3.1415926*3.0,3.1415926*3.0*3.0); 编 译 预 处 理 命 令 4 不是进行简单的字符串替换,还要进行参数替换。 v其定义的一般形式为: #define 宏名(参数表) 字符串 例如:#define S(a,b) a*b #define PR(x) printf("s=%f\n”, x) 2. 带参数的宏定义 v带实参的宏名被展开时,宏名被所定义的宏体替换, 宏体中的形参按从左到右的顺序被实参替换。 area=S(3,2)展开的结果是: area=3*2; S(a+c, b+c)展开的结果是: a+c*b+c; PR(area)展开的结果是: printf("s=%f\n”, area) v在宏定义时,在宏名与带参数的括弧之间不应加空格, 否则将空格以后的字符都作为替代字符串的一部分。 编 译 预 处 理 命 令 5 带参数的宏与函数有什么不同? 1.使用带参的宏实参对形参只是进行简单的字符串替换。 2. 宏在展开时并不分配内存单元,不进行值的传递处理,也 没有返回值的概念。 3. 宏不存在类型问题,宏名无类型,它的参数也无类型,只 是一个符号代表而已。 4.宏替换不占运行时间,只占编译时间。而函数调用则占运 行时间。 编 译 预 处 理 命 令 6 1. 文件包含是指一个源文件可以将另一个源文件的全部 内容包含进来。 2.#include命令有两种格式。 #include #include “文件名“ 3.两种格式区别 编译系统寻找文件的方式不同,尖括号表示直接到包含 目录(include)查找,常用于嵌入系统提供的标准文件; 双引号首先在当前文件目录查找,常用于包含用户自己 编写的文件 4.程序设计中,常常把公用符号常量或者宏定义组成一 个文件,减少重复书写。 « 文件包含 编 译 预 处 理 命 令 7 文件 at.h #define PR printf #define NL “\n“ #define D “%d“ #define D1 D NL #define D2 D D NL #define D3 D D D NL #define D4 D D D D NL 文件 print.c #include “at.h “ void main() {int a,b,c,d; a=1;b=2;c=3;d=4; PR (D1,a); PR (D2,a,b); PR (D3,a,b,c); PR (D4,a,b,c,d); } 例:用宏代表输出格式 编 译 预 处 理 命 令 8 它的功能是:当标识符已经被定义过,则对程序段1进行编 译,否则编译程序段2,其中#else部分可以没有。 « 条件编译 一般情况下,源程序的所有行都参加编译,但有时希 望对其中一部分内容只在满足一定条件时才进行编译, 也就是对一部分内容指定编译的条件,这就是条件编 译。条件编译有以下3种形式: 1.#ifdef 标识符 程序段1 #else 程序段2 #endif #ifdef 标识符 程序段1 #endif 编 译 预 处 理 命 令 9 它的作用是:当指定的 表达式值为真(非0) 时就编译程序段1,否则 编译程序段2。 2.#ifndef 标识符 程序段1 #else 程序段2 #endif 第一行与第一种形式不同: 将ifdef改为ifndef。 它的作用是:若标识符未被 定义,则编译程序段1,否 则编译程序段2。 3.#if 表达式 程序段1 #else 程序段2 #endif

    展开全文
  • 第九章编译预处理C语言提供了一些以#开头的指令,如#第九章 编译预处理 C语言提供了一些以#开头的指令,如: #define #include 等。 这些指令是在编译以前就事先进行处理的,因而称为“编译预处理”指令。 可以用编译...

    第九章编译预处理C语言提供了一些以#开头的指令,如#

    第九章 编译预处理 C语言提供了一些以#开头的指令,如: #define #include 等。 这些指令是在编译以前就事先进行处理的,因而称为“编译预处理”指令。 可以用编译预处理指令实现以下三种功能: 1) 宏定义 2) 文件包含 3) 条件编译 9.1 宏定义 1、不带参的宏定义 用一个指定的标识符(宏名)代表一个字符串。 一般形式: #define 标识符 字符串 如:#define PI 3.1425926 有了这一宏定义后,程序中凡是用到3.1425926的地方都可以以宏名PI出现。 例:定义一个宏名来代表一个参数。 #define PI 3.1425926 main() { float r=2,c,s; c=2*PI*r; s=PI*r*r; ┈} 系统在对程序进行编译以前,首先将所有的编译预处理指令进行预处理,对本例来说,就是将程序中所有的宏名PI还原成3.1425926, ——宏展开。 例:定义一个宏名来代表一个数据个数。 #define N 100 main() { int a[N],i; float s=0; for(i=0;i #include “file2.c” 例: #include “math.h” main() { float a,b,c,s,area; scanf(“%f%f%f”,&a,&,&c); s=0.5*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c)); printf(“\n %f”,area); } #include “f.h” main() { printf(“\n%f”,f1(3.0)); printf(“\n %f”,fac(10)); } float f1(float r) { return(PI*r*r); } float fac(int n) { int i; float s=1; for(i=1;i<=n;i++) s*=i; return(s); } * A file1.c A B B file1.c file2.c #define PI 3.1415926 float f1(float r); float fac(int n); f.c f.h *

    展开全文
  • 《级C语言编译预处理》由会员分享,可在线阅读,更多相关《级C语言编译预处理(20页珍藏版)》请在人人文库网上搜索。1、张居克,2010.11.21,编译预处理,电子邮件:编译预处理,1。宏定义和调用(不带参数的宏,带...

    《级C语言编译预处理》由会员分享,可在线阅读,更多相关《级C语言编译预处理(20页珍藏版)》请在人人文库网上搜索。

    1、张居克,2010.11.21,编译预处理,电子邮件:编译预处理,1。宏定义和调用(不带参数的宏,带参数的宏)。2.“文件包含”处理。1.宏观定义。1.不带参数的宏定义的一般形式:#定义以“#”开头的标识符字符串都是预处理命令。“定义”是宏定义命令的“标识符”,而定义的宏名称“字符串”可以是常量、表达式、格式字符串等。例如:#定义PI 3.1415926,预处理命令,程序示例:#定义PI 3.14主(int)r;scanf(“r :% d”),预处理命令,不带参数的宏定义的一般规则:宏名称通常用大写字母表示,而不是经常出现在程序中的常量。宏定义使用宏名而不是字符串,当宏被展开时,它们使用该字符串。

    2、而不是宏名。预处理程序不会检查它。如果有任何错误,它们只能在编译由宏扩展的源程序时找到。预处理命令和宏定义不是描述或语句,所以不需要在行尾添加额外的标记。如果添加了分号,用分号替换的定义必须写在函数之外,并且它们的范围是结束源程序的宏定义命令。如果您想终止它的作用域,可以使用# undef命令。如果宏名在源程序中用引号括起来,预处理器不会用宏替换它。预处理命令和宏定义可以嵌套。在宏定义字符串中,定义的宏名称可以用宏定义来表示数据类型,这使得编写更加方便。但是,有必要对“输出格式”进行不同于typedef的宏定义,这样可以减少编写麻烦,但是不建议使用预处理命令。2.带参数的宏定义的一般形式:#定。

    3、义宏名(参数表)字符串带参数的宏调用的一般形式是:宏名(参数表);例如:#定义M(y)y * y 3 * y k=M(5);相当于k=5 * 5 3 * 5预处理命令,带参数的宏定义的一般规则:宏名和形式参数表之间不能有空格,形式参数不分配内存单元,所以没有必要定义类型。宏调用中的参数有特定的值。要使用它们来替换形式参数,有必要进行类型描述。宏定义中的形式参数是标识符,而宏调用中的实际参数可以是表达式和预处理命令。在宏定义中,字符串中的形式参数通常用括号括起来以避免错误。其次,如果一个文件包含一个源文件,它可以包含另一个源文件的所有内容。常规形式:#包含文件名或#包含常规库文件。用户定义文件,。

    4、预处理命令,3。条件编译1。第一种形式:#ifdef标识符部分1 #else部分2 #endif,预处理命令,函数:如果标识符已经由#define命令定义,则编译部分1;否则,编译程序第2节。如果没有程序段2(它是空的),这种格式的#else可以写成:#ifdef标识符程序段#endif,预处理命令,程序示例:main()# if ndef pi printf(“pi未定义n”);#endif,预处理命令,2。第二种形式:#ifndef标识符段1 #否则段2 #endif,预处理命令,函数:如果标识符不是由#define命令定义的,则编译段1,否则编译段2。与第一种形式的功能相反,预处理命令。。

    5、第三种形式:#如果常量表达式程序段1 #否则程序段2 #endif,预处理命令,函数:如果常量表达式的值为真(不为零),编译程序段1,否则编译程序段2。因此,程序可以在不同的条件下完成不同的功能和预处理命令。例如,#定义pi 3.14 main()# if ndef pi printf(“pi未定义”);#否则打印(“PI定义为”,PI);# endif printf( n );预处理命令,摘要,1。预处理函数是一种特定于语言的函数,它是由预处理程序在源程序正式编译之前完成的。程序员使用预处理命令在程序中调用这些函数。2.宏定义是用一个标识符来表示一个字符串,它可以是常量、变量或表达式。宏名称将在宏调用中被该字符串替换。3.宏定义可以有参数,在宏调用中,形式参数将被实际参数代替。而不是“价值转移”。为了避免宏替换中的错误,宏定义中的字符串应该用括号括起来,字符串中出现的形式参数的两边也应该用括号括起来。5.文件包含是预处理的一个重要功能,它可以用来将多个源文件连接成一个源文件进行编译,生成一个目标文件。6.条件编译只允许编译源程序中满足条件的程序段,使生成的目标程序更短。从而减少了内存开销,提高了程序的效率。7.使用预处理功能便于程序的修改、读取、移植和调试,也便于实现模块化程序设计。

    展开全文
  • c语言第03章-编译预处理2第3章 编译预处理 编译预处理是指,编译时,首先对编译预处理命令进行处理,然后再将预处理后的中间结果进行编译,以得到目标代码。 教学目的: 掌握#define、#include的用法和用途; 了解...
  • C语言编译预处理程序设计教程编译预处理 在C语言中包含一类特殊的命令(或称指令),这类特殊命令的作用不是直接实现程序的功能,而是为C语言编译系统提供信息,这些信息将通知C语言编译器在对源程序进行正式编译...
  • C语言编译预处理

    千次阅读 2019-08-05 08:18:43
    编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件 其中编译预处理阶段,读取C源程序,对其中的预处理指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行...
  • C++编译预处理

    2014-12-16 17:05:43
    C++编译预处理,关于C++学习的课件,可以帮助C++的学习
  • 2020c语言编译预处理.ppt
  • VerilogHDL编译预处理

    2018-01-02 09:11:46
    编译预处理语句 编译预处理是VerilogHDL编译系统的一个组成部分,指编译系统会对一些特殊命令进行预处理,然后将预处理结果和源程序一起在进行通常的编译处理。以”`” (反引号)开始的某些标识符是编译预处理语句...
  • 第10章 编译预处理 编译预处理的概念 宏定义 文件包含 条件编译 10.1 编译预处理的概念 编译预处理是指在编译程序对源程序进行编译之前由编译预处理程序所做的工作其目的是对程序中的特殊命令作出解释以产生新的源...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 116,479
精华内容 46,591
关键字:

编译预处理