预处理指令
- 格式:ppt
- 大小:313.00 KB
- 文档页数:26
C语言中的预处理指令在C语言编程中,预处理指令是一种特殊的指令,用于在编译阶段之前对源代码进行处理。
预处理指令以井号(#)开头,并且不是被编译器执行的实际指令,而是由预处理器处理的。
本文将详细介绍C语言中的预处理指令,并探讨其在程序开发中的作用和用法。
一、什么是预处理指令预处理指令是在编译阶段之前对源代码进行处理的指令。
它的作用是在编译之前对源文件进行一些文本替换、条件编译或者简单的文本粘贴工作。
预处理指令以井号(#)开头,且位于编译单位(源文件或头文件)的最开始位置。
二、预处理指令的作用1. 宏定义宏定义是预处理指令中使用最广泛的功能之一。
通过宏定义,可以为一段代码或者一个常量起一个易于记忆和使用的名字,从而提高代码的可读性和维护性。
下面是一个宏定义的示例:```c#define MAX_NUM 100```在这个例子中,宏定义了一个名为MAX_NUM的常量,它的值为100。
在后续的代码中,可以使用MAX_NUM来代表100,避免了重复书写代码的问题。
2. 文件包含预处理指令还可以使用#include指令将其他文件的内容包含到当前文件中。
这种方式可以在不同的源文件中共享代码,提高代码的复用性。
下面是一个文件包含的示例:```c#include <stdio.h>```通过#include指令,可以将系统库文件stdio.h中的代码包含到当前文件中,以便后续代码可以使用stdio.h中定义的函数和类型。
3.条件编译条件编译是预处理指令中非常重要的概念。
通过条件编译,可以根据条件的真假选择性地编译代码。
这在不同的操作系统、不同的编译器或者不同的编译选项下具有重要的意义。
下面是一个条件编译的示例:```c#ifdef DEBUGprintf("Debug mode\n");#endif```在这个例子中,只有在编译时定义了DEBUG宏的情况下,才会编译并执行printf语句。
预处理指令预处理命令1 . 基本介绍使⽤库函数之前,应该⽤#include引⼊对应的头⽂件,这种以#开头的命令称为预处理命令这些在编译之前对源⽂件进⾏简单加⼯的过程,就称为预处理(即预先处理,提前处理)预处理主要是处理以#开头的命令。
例如#include<stdio.h>,预处理命令要放在所有函数之外,⽽且⼀般都放在源⽂件的前⾯预处理是C语⾔的⼀个重要功能,由预处理程序完成,当对⼀个源⽂件进⾏编译时,系统将⾃动调⽤预处理程序对源程序中的预处理部分做处理,处理完毕⾃动进⼊对源程序的编译C语⾔提供了多种预处理功能,如宏定义,⽂件包含,条件编译,合理的使⽤会使编写的程序便于阅读,修改,移植和调试,也有利于程序模块化设计2 . 快速⼊门2.1 具体要求开发⼀个C语⾔程序,让它暂停5秒以后再输出内容“hello 尚硅⾕”,并且要求跨平台,在Windows和Linux下都能运⾏2.2 提⽰Windows平台下的暂停函数的原型是void Sleep(DWORD dwMilliseconds),参数的单位是“毫秒”,位于<windows.h>头⽂件linux平台下暂停函数的原型是unsigned int sleep(unsigned int second),参数的单位是“秒”,位于<unistd.h>头⽂件if ,#endif ,就是预处理命令,他们都是在编译之前由预处理程序来执⾏的2.3 代码实现#include<stdio.h>//说明:在Windows操作系统和Linux操作系统下,⽣成源码不⼀样#incLude<windows.h>int main(){Sleep(5000);puts("hello ,尚硅⾕");getchar();rerurn 0;}#if_WIN32 //如果是windows平台,就执⾏#include<windows.h>#include<windows.h>#elif_linux_//否则判断是不是linux,如果是linux就引⼊<unistd.h>#include<unistd.h>#endifint main(){//不同的平台调⽤不同的函数#if_WIN32Sleep(5000);#elif_linux_sleep(5);#endifputs("hello,尚硅⾕");getchar();return 0;}3 . 宏定义3.1 基本介绍define叫做宏定义命令,它⼜是C语⾔预处理命令的⼀种。
预处理指令,宏和运算符当编译程序时,它做的第一件事是进行预处理。
这一阶段中,甚至可以人为地将编译器视为一个不同的实体——预处理器。
该阶段中,编译器读入头文件、决定编译哪些行的源代码并执行文本替换。
预编译阶段的优越性在于它的编译及运行之前执行了某些特定的操作。
这些操作并不添加额外的程序执行时间。
同时,这些命令也不与程序运行时所发出的任何指令相对应。
所以,在使用预处理指令时就需要兼顾实际的运行情况。
预处理的三个基本元素:指令:在程序编译前执行的特定命令。
预定义宏:在编译前所执行的特定命令。
预处理运算符:在#if和#define中使用。
预处理指令语法与C++的其它语法有所不同。
指令以行末结束,而不需要分号。
但你可以用续行符(\)来摆脱物理行的限制。
另外,指令必须从第一行开始。
指令:有一半预处理指令提供了对条件编译的支持,条件编译的作用是用来维护同一程序的不同版本。
这些指令包括:#if #ifdef #elif #ifndef #else #end其余的预处理指令提供了对其它功能的支持,例如包括头文件和宏定义:#define #include #pragma #error #line #undef详解:★#define [定义符号或宏]目的:一:提供了创建符号常量的有效信息途径。
二:使编写人员能写宏指令,这些宏指令看上去像函数调用,但实际上是通过文本替换来实现。
三:简单地定义某些符号作为#ifdef指令的开关。
语法格式:#define标识符替代值#define 标识符[(参数1,.....,参数n)] 替代值其中,在”替代值”中出现的形参将在使用时被实参替代. 就象写函数一样.#define 标识符◆用法一:符号常量有些程序用到了一些很重要但又非常难忘或难以输入的数字。
最好事先将它们转化成为符号常量。
在转化时,通常是以大写形式表示,以便将它们与变量名区分开来。
例:#define E 2.718281828459这条指令的意思是每当程序中出现E时,预处理器就会将E替换成2.718281828459。
C语言的预处理指令与宏定义优化概述C语言是一种广泛使用的编程语言,其灵活性和高效性使得它成为许多开发者的首选语言。
在C语言中,预处理指令和宏定义是两个重要的概念,可用于优化代码和增加代码的可读性。
本文将介绍C语言的预处理指令和宏定义,并探讨如何利用它们进行代码优化。
什么是预处理指令?预处理指令是在编译之前执行的一系列指令,它们用于对源代码进行一些处理,以产生最终的编译代码。
预处理指令以“#”字符开头,并且在一行中独立存在。
预处理指令是在编译器编译源代码之前,由预处理器(preprocessor)负责处理的。
预处理指令的作用预处理指令有多种作用,主要包括以下几个方面:1.宏定义(Macro definition):通过宏定义,可以将一组代码片段用一个名字代替,从而减少重复编码,提高代码的可读性。
宏定义可以带有参数,使得代码更加灵活。
2.文件包含(File inclusion):通过预处理指令“#include”,可以在源代码中插入其他文件的内容,这样可以将代码模块化,提高代码的易读性和可维护性。
3.条件编译(Conditional compilation):通过预处理指令“#ifdef”、“#ifndef”、“#endif”等,可以根据条件来选择性地编译一部分代码,从而实现不同的功能组合。
4.符号替换(Symbol substitution):通过预处理指令“#define”,可以将一个符号替换为另一个符号,从而可以在源代码中使用更加易懂的符合语义的名称。
什么是宏定义?宏定义是一种在代码中定义一个标识符的方法,它可以被替换为一段代码或一个值。
宏定义以“#define”关键字开头,后面是宏的名称和它所代表的值或代码。
宏定义以“#define”关键字开头,后面是宏的名称和它所代表的值或代码。
在程序中,当遇到该宏的名称时,预处理器会将其替换为宏的值或代码。
宏定义的优化技巧使用宏定义可以提高代码的可读性和可维护性,同时也可以优化代码的性能和减少代码的长度。
本章主要内容:宏定义文件包含条件编译1.1编译预处理编译预处理是在对源程序正式编译之前的处理,以“#”开头,如文件包含“#include”、宏定义“#define”等。
预处理命令不是C语言本身的组成部分,不能直接对它进行编译。
所有的预处理指令都是在编译之前完成的,不占用程序运行时间。
C语言提供了3中预处理功能,即宏定义、文件包含、条件编译。
以“#”开头,占用一个单独的书写行,语句结尾不适用分号。
宏定义:#define文件包含:#include条件编译:#ifndef…#if…#else…#endif等1.2宏定义1.2.1不带参数的宏定义语法格式:#define 宏名[宏体](宏体可省略,如果没有则作为一个标识用于#if语句中)功能:用指定标识符(宏名)代替字符序列(宏体)说明:宏名要是一个合法的标识符,通常采用大写字母表示;宏体可以是常数、表达式和语句,甚至可以是多条语句。
举例:#define PI 3.1415926 //定义π的值为3.1415926,以后要用到π,就可以直接用PI #define OUT printf(“Hello World!\n”); //定义宏OUT替换后面的函数用#undef可以终止宏名作用域,格式为:#undef 宏名举例:void main(){#define YES 1 //定义宏YESprintf("%d\n",YES);#undef YES //结束宏YES的作用域#define YES 0 //重新定义宏YESprintf("%d\n",YES);}有关宏定义的使用,需注意以下几点:1宏名习惯采用大写,以便与普通变量区分;2宏定义不是C语句,所以不能在行尾加分号;否则,宏展开时,会将分号也算在内3在宏展开时,预处理程序仅按宏定义简单替换宏名,不做任何检查。
如果有错误,只能由编译器在编译宏展开后的源程序时发现。
4宏定义的位置是任意的,宏名的有效范围是从定义命令处到本模块结束。
10.2预处理指令主要有三种类型:1、宏定义:#define和#undef指令2、文件包含:#include指令3、条件编译:#if、#ifdef、#ifndef、#elif、#else和#endif指令宏定义包含带参数的宏和不带参数的宏两种;带参数的宏定义格式为:#define 标识符(X1,X2,X3…)替换列表其与函数调用的结果完全不同,详见12/22程序macro with parameter通过程序实例得出,为了避免宏名参与的运算结果不混淆,一般采用如下两种形式的定义方式:1、#define AREA(X)(X)*(X)2、#define AREA(X)(X*X)替代#define AREA(X)X*X避免在宏定义中使用自增符号,如对于宏定义#define AREA(X)(X*X),AREA(++X),被展开为++X*++X,假如X初值为5,则其运算结果可能为42或者49,由于未规定运算顺序,编译器可能会出现不同的结果宏定义与函数有类似的地方,宏代替函数有以下优点:1、从效率角度考虑,程序执行起来会更快些,在调用函数时总会有些额外的开销,如保存调用点的信息以便函数调用结束后能正确返回调用点,而宏调用则没有这些运行时的开销;2、宏更加通用。
与函数不同,宏的参数是没有类型的,因此,宏可以接收任何类型的参数,因此它的使用范围更加广泛同时,也会以下缺点:1、源程序编译后代码量会增加,预处理过程中会在每一处宏调用的地方插入宏的替换列表,显然会使源程序的代码增加;2、预处理器不会检查宏参数的类型,也不会进行类型转换,这样采用宏调用可能会产生错误的结果3、自增、自减运算不能在宏中进行,可能会导致错误的结果;#运算符和##运算符只能出现在带参数宏的替换列表中,例如x为一个宏的参数,那么#x就可以将参数名转化为相应的字符串,该过程称为字符串化(stringization),程序实例详见12.23 stringization##运算符,如果##连接的两个操作数中其中一个为宏的参数,那么会先进行参数替换,然后再执行##运算符的操作。
预处理命令1,所有的预处理指令都是以#号开头的
2,预处理指令分3种:
1>宏定义:#define COUNT 4 //后边没有任何符号 #undef COUNT结束宏定义
2>条件编译
#define A 5
#if (A==5)
printf("A是5");
#elif
printf("A是10");
#else
printf("A是其他");
#endif
return 0;
#if defined(A)//如果A是宏定义
3>⽂件包含
#include "lisi.h"
为了减少过多次的引⼊⽂件造成的编译效率的降低,建议在每个被引⼊⽂件内都加⼊#ifndef LISI_H //以⽂件名定义宏变量
#define LISI_H 123
int sum(int a,int b);
#endif
3.1 <>表⽰系统⾃带的⽂件,""表⽰⾃定义⽂件
3.2 不允许循环包含,⽐如说a.h包含b.h ,⽽b.h⼜包含a.h
3,预处理指令在代码翻译晨0和1之前执⾏
4,预处理指令的位置是随便写的
5,预处理指令的作⽤范围:从编写指令的那⼀⾏开始,⼀直到⽂件的结尾
6,宏名⼀般⽤⼤写或者以k开头,变量名⼀般⼩写
带参数的宏定义效率⽐函数⾼:
#define sum(v1,v2) ((v1)+(v2))
#define pingfang(v1,v2) ((v1)*(v2))。
C语言程序的基本结构一、预处理指令预处理指令以“#”符号开头,用于提供指示器供编译器使用。
预处理指令可以包括文件包含、宏定义和条件编译等。
1. 文件包含:使用预处理指令“#include”可以将其他头文件包含到当前源文件中,以便可以使用其中定义的函数和变量。
```c#include <stdio.h>```2. 宏定义:使用预处理指令“#define”可以定义宏,宏会在编译前被展开为相应的代码。
```c```3. 条件编译:使用预处理指令“#ifdef”、“#ifndef”、“#if”等可以根据条件选择是否编译段代码。
```c#ifdef DEBUGprintf("Debugging mode\n");#endif```二、全局变量全局变量是在函数外部定义的变量,可以在整个程序中被访问和使用。
全局变量必须在使用之前进行声明或定义。
```c#include <stdio.h>int globalVariable;int mai// do somethingreturn 0;```三、函数声明函数声明用于告诉编译器有一个函数存在,它的名称、参数和返回类型等信息。
函数声明一般放在头文件中,可以被多个源文件共享。
```c#include <stdio.h>int add(int a, int b);int maiint result = add(3, 5);printf("Result: %d\n", result);return 0;int add(int a, int b)return a + b;```四、函数定义函数定义包含了函数的具体实现,函数定义一般放在源文件中,用于实现函数的功能。
```c#include <stdio.h>int add(int a, int b)return a + b;int maiint result = add(3, 5);printf("Result: %d\n", result);return 0;```五、函数调用函数调用是通过函数名和参数列表来调用函数,可以将函数的返回值赋给变量或直接输出结果。