第12讲预处理命令

合集下载

C语言中的预处理指令

C语言中的预处理指令

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语句。

C语言预处理命令总结大全.docx

C语言预处理命令总结大全.docx

C语言预处理命令总结大全(2012-02-13 17:18)标签:C语言预处理分类:C编程C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。

虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境。

本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。

ANSI标准定义的C 语言预处理程序包括下列命令:#defi ne ,#error ,# in elude , #if , #else , #elif , #en dif , #ifdef , #if ndef , #undef, #line , #pragma等。

非常明显,所有预处理命令均以符号#开头,下面分别加以介绍。

命令#define定义了一个标识符及一个串。

在源程序中每次遇到该标识符时,均以定义的串代换它。

ANSI标准将标识符定义为宏名,将替换过程称为宏替换。

命令的一般形式为:#define identifier string1该语句没有分号。

在标识符和串之间可以有任意个空格,串一旦开始,仅由一新行结束。

2宏名定义后,即可成为其它宏名定义中的一部分。

3宏替换仅仅是以文本串代替宏标识符,前提是宏标识符必须独立的识别出来,否则不进行替换。

例如:#defi ne XYZ this is a tes使用宏printf("XYZ") ;//该段不打印"this is a test"而打印"XYZ"。

因为预编译器识别出的是"XYZ"4如果串长于一行,可以在该行末尾用一反斜杠’\'续行。

#defi neLONG_STRING"this is a very long\stri ng that is used as an example"5 C语言程序普遍使用大写字母定义标识符。

6用宏代换代替实在的函数的一大好处是宏替换增加了代码的速度,因为不存在函数调用的开销。

c语言的预处理指令分3种  1宏定义  2条件编译  3文件包含

c语言的预处理指令分3种  1宏定义  2条件编译  3文件包含

c语⾔的预处理指令分3种 1宏定义 2条件编译 3⽂件包含宏简介1.C语⾔在对源程序进⾏编译之前,会先对⼀些特殊的预处理指令作解释(⽐如之前使⽤的#include⽂件包含指令),产⽣⼀个新的源程序(这个过程称为编译预处理),之后再进⾏通常的编译所有的预处理指令都是以#开头,并且结尾不⽤分号2.预处理指令分3种 1> 宏定义 2> 条件编译 3> ⽂件包含3.预处理指令在代码翻译成0和1之前执⾏4.预处理的位置是随便写的5.预处理指令的作⽤域:从编写指令的那⼀⾏开始,⼀直到⽂件结尾,可以⽤#undef取消宏定义的作⽤6.宏名⼀般⽤⼤写或者以k开头,变量名⼀般⽤⼩写 宏定义可以分为2种:不带参数的宏定义和带参数的宏定义。

⼀、不带参数的宏定义1.⼀般形式#define 宏名字符串⽐如#define ABC 10右边的字符串也可以省略,⽐如#define ABC2.作⽤它的作⽤是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常⽤来定义常量.3.使⽤习惯与注意1> 宏名⼀般⽤⼤写字母,以便与变量名区别开来,但⽤⼩写也没有语法错误2> 对程序中⽤双引号扩起来的字符串内的字符,不进⾏宏的替换操作。

3> 在编译预处理⽤字符串替换宏名时,不作语法检查,只是简单的字符串替换。

只有在编译的时候才对已经展开宏名的源程序进⾏语法检查4> 宏名的有效范围是从定义位置到⽂件结束。

如果需要终⽌宏定义的作⽤域,可以⽤#undef命令5> 定义⼀个宏时可以引⽤已经定义的宏名#define R 3.0#define PI 3.14#define L 2*PI*R#define S PI*R*R举例1 #include <stdio.h>2#define COUNT 434int main()5 {6char *name = "COUNT";78 printf("%s\n", name);910int ages[COUNT] = {1, 2, 67, 89};1112#define kCount 41314for ( int i = 0; i<COUNT; i++) {15 printf("%d\n", ages[i]);16 }1718// 从这⾏开始,COUNT这个宏就失效19#undef COUNT2021//int a = COUNT 写这个报错2223return0;24 }⼆、带参数的宏定义1.⼀般形式#define 宏名(参数列表) 字符串2.作⽤在编译预处理时,将源程序中所有宏名替换成字符串,并且将字符串中的参数⽤宏名右边参数列表中的参数替换3.使⽤注意1> 宏名和参数列表之间不能有空格,否则空格后⾯的所有字符串都作为替换的字符串2> 带参数的宏在展开时,只作简单的字符和参数的替换,不进⾏任何计算操作。

预处理指令详解

预处理指令详解

#pragma#pragma 预处理指令详解在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。

#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。

依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。

其格式一般为: #Pragma Para其中Para 为参数,下面来看一些常用的参数。

(1)message 参数。

Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。

其使用方法为:#Pragma message(“消息文本”)当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。

当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。

假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法#ifdef _X86#Pragma message(“_X86 macro activated!”)#endif当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated!”。

我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。

(2)另一个使用得比较多的pragma参数是code_seg。

格式如:#pragma code_seg( ["section-name"[,"section-class"] ] )它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。

(3)#pragma once (比较常用)只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。

C语言中的预处理详解

C语言中的预处理详解

C语言中的预处理详解目录一.预处理的工作方式 (3)1.1.预处理的功能 (3)1.2预处理的工作方式 (3)二.预处理指令 (4)2.1.预处理指令 (4)2.2.指令规则 (4)三.宏定义命令----#define. 43.1.无参数的宏 (4)3.2带参数的宏 (5)3.3.预处理操作符#和##. 63.3.1.操作符#. 63.3.2.操作符##. 6四.文件包含------include. 6五.条件编译 (7)5.1使用#if 75.2使用#ifdef和#ifndef 95.3使用#defined和#undef 10六.其他预处理命令 (11)6.1.预定义的宏名 (11)6.2.重置行号和文件名命令------------#line. 11 6.3.修改编译器设置命令 ------------#pragma. 12 6.4.产生错误信息命令 ------------#error 12 七.内联函数 (13)在嵌入式系统编程中不管是内核的驱动程序还是应用程序的编写,涉及到大量的预处理与条件编译,这样做的好处主要体现在代码的移植性强以及代码的修改方便等方面。

因此引入了预处理与条件编译的概念。

在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令。

预处理命令属于C语言编译器,而不是C语言的组成部分。

通过预处理命令可扩展C语言程序设计的环境。

一.预处理的工作方式1.1.预处理的功能在集成开发环境中,编译,链接是同时完成的。

其实,C语言编译器在对源代码编译之前,还需要进一步的处理:预编译。

预编译的主要作用如下:●将源文件中以”include”格式包含的文件复制到编译的源文件中。

●用实际值替换用“#define”定义的字符串。

●根据“#if”后面的条件决定需要编译的代码。

1.2预处理的工作方式预处理的行为是由指令控制的。

这些指令是由#字符开头的一些命令。

#define指令定义了一个宏---用来代表其他东西的一个命令,通常是某一个类型的常量。

预处理指令——精选推荐

预处理指令——精选推荐

预处理指令预处理命令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语⾔预处理命令的⼀种。

预处理指令

预处理指令

#include 指令
#include 指令的作用是指示编译器将该指令所指出的另一个源文件嵌入#include指令所在 的程序中, 文件应使用双引号或尖括号括起来. C 库函数的头文件一般用#include指令在程序开关说明. 例如: #include <stdio.h> 程序中也允许嵌入其它文件, 例如: main() { #include <help.c> } 其中help.c为另一个文件, 内容可为 printf("Glad to meet you here!"); 处理命令的格式 #include "包含文件名" 或 #include <包含文件名 包含文件名" 包含文件名> 包含文件名 包含文件名 两种格式的区别仅在于: (1)使用双引号:系统首先到当前目录下查找被包含文件,如果没找到,再到系统指定 的"包含文件目录"(由用户在配置环境时设置)去查找. (2)使用尖括号:直接到系统指定的"包含文件目录"去查找.一般地说,使用双引号 比较保险.
可变参数的函数
我们在C语言编程中会遇到一些参数个数可变的函数, 例如printf()这个函数,它的定义是这样的: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数 和类型是可变的,例如我们可以有以下不同的调用方法: printf("%d",i); printf("%s",s); printf("the number is %d ,string is:%s", i, s); 究竟如何写可变参数的C函数以及这些可变参数的函数 编译器是如何实现的呢?现在就这个问题进行一些探讨,希望 能对大家有些帮助.

预处理命令

预处理命令

定义矩形面积S,a和B是边长。在程序中用了s(3, 2),把3、2分别代替宏定义中的形式
图9.1
参数a、b,即用3*2代替s(3,2)。因此赋值语句展 开为area=3*2; 对带参的宏定义是这样展开置换的:在程序中如果 有带实参的宏(如S(3,2)),则按#define命令行中 指定的字符串从左到右进行置换。如果串中包含 宏中的形参(如a、b),则将程序语句中相应的实 参(可以是常量、变量或表达式)代替形参,如果宏 定义中的字符串中的字符不是参数字符(如a*b中 的*号),则保留。这样就形成了置换的字符串, 见图9.1。
例9.1 #define PI 3.1415926 main() {float l,s,r,v; printf("input raDiuS∶"); scanf("%f",&r); l=2.0*PI*r; s=PI*r*r; v=3.0/4*PI*r*r*r; printf("l=%10.4f\nS=%10.4f\nv=%10.4f\n",l,s, v); }
#define g 8.8 main() { | … } #undef g f1() { …
G的有效范围
} 由于#undef的作用,使G的作用范围在#undef行处终止,因 此在f1函数中,g不再代表8.8。这样可以灵活控制宏定义 的作用范围。
(7) 在进行宏定义时,可以引用已定义的宏名,可以 层层置换。 例9.2 #define R 3.0 #define PI 3.1415926 #define L 2*PI*R #de\ns=%f\n",L,S); }
(5) 使用宏次数多时,宏展开后源程序长,因为每展 开一次都使程序增长,而函数调用不使源程序变 长。 (6) 宏替换不占运行时间,只占编译时间。而函数调 用则占运行时间(分配单元、保留现场、值传递、 返回)。 一般用宏来代表简短的表达式比较合适。有些 问题,用宏和函数都可以。如: #define MAX(x,y) (x)>(y)?(x)∶(y) main() {int a,b,c,d,t; …
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

宏定义命令的几点说明



宏被定义以后,一般不能再重新定义。但 可以用#undef来终止宏定义。 一个定义过的宏名可以用来定义其他新的 宏,但要注意其中的括号。 如:#define A 20 #define B (A+10) 还可以有带参数的宏替换。 如: #define MAX(a,b) ((a)>(b)?(a):(b))
文件包含命令 (1)文件名一般是以.h为扩展名, p109
说明:



因而称它为“头文件” 文件包含 (2)文件包含的两种格式区别在于: 所谓“文件包含”是指将 将文件名用“< >”括起来,用来 另一个源文件的内容合并 包含那些由系统提供的并放在指 到当前程序中。 定子目录中头文件; 文件包含命令的一般形式为: 将文件名用双引号括起来的,用 #include<文件名> 来包含用户自己定义的放在当前 或 #include”文件名” 目录或其他目录下的头文件或其 作用 他源文件。 文件包含可以将头文件中 (3)一条#include命令只能包含一 的内容直接引入,而不必 个文件,若想包含多个文件,则 再重复定义,减少了重复 应使用多条包含命令 劳动,节省了编程时间。
学到了什么

预处理命令: 宏定义命令 文件包含命令 条件编译命令
宏定义命令

p108

宏定义的一般形式为: #define 宏名 字符串 例子: #define PI 3.1415926 说明:


define是宏替换的关键字, “宏名”是需要替换的标识符, “字符串”是被指定用来替换的字符序列。 #define、宏名和字符串之间一定要有空格。 宏名一般用大写字母表示,以区别于普通标识符。
条件编译命令

p109
条件编译

在一般情况下,源程序中的所有语句都会参加编译, 但是有时候会希望根据一定的条件编译源文件的部分 语句,这就是“条件编译”。

条件编译使得同一源程序在不同的编译条件下得到不 同的目标代码。

常用的条件编译命令有如下三种:
条件编译命令

格式1 #ifdef 标识符 程序段1 #else
程序段2 #endif 该条件编译命令的功能是:

ቤተ መጻሕፍቲ ባይዱ

如果在程序中定义了指定的“标识符”时,就用程序 段1参与编译,否则,用程序段2参与编译。
条件编译命令


格式2 #ifndef 标识符 程序段1 #else 程序段2 #endif 该条件编译命令的功能是:

如果在程序中未定义指定的“标识符”时,就用程序 段1参与编译,否则,用程序段2参与编译。
预处理命令
制作者:车万翔
学习内容

预处理命令: 宏定义命令 文件包含命令 条件编译命令
编译预处理

p108


编译预处理命令 在C++程序的源代码中可以使用各种编译指令,这些指 令称为编译预处理命令。 C++提供的预处理命令主要有以下三种: 宏定义命令 文件包含命令 条件编译命令 特点: 这些命令在程序中都是以“#”来引导, 每条预处理命令必须单独占用一行; 它们不是C++的语句,因此在结尾没有分号“;”
条件编译命令





格式3 #if 常量表达式1 程序段1 #elif常量表达式2 程序段2 …… #elif常量表达式n 程序段n #else 程序段n+1 #endif 该条件编译命令的功能是:

依次计算常量表达式的值,当表达式的值为真时,则用相应的程序段参 与编译,如果全部表达式的值都为假,则用else后的程序段参与编译。
相关文档
最新文档