c语言提供了三种预处理命令,9、C语言之预处理命令

预处理命令

基本概念:ANSI C标准规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编程效率。

这些预处理命令是由ANSI C同一规定的,但是它们不是C语言本身的组成部分,不能直接对它们进行编译(因为编译程序不能识别它们)。必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预编译”

经过预处理后的程序可由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。

C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。

C提供的预处理功能主要有以下三种:

1、宏定义

2、文件包含

3、条件编译

这些功能分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语言相区别,这些命令以符号“#”开头。例如:#define  #include

1、宏定义

不带参数的宏定义

宏定义一般形式:

#define 标识符  字符串

#define PI 3.1415926

宏定义的作用时在本程序文件中使用指定的标识符PI来代替“3.1415926”这个字符串,在编译预处理时,将程序中在该命令以后出现的所有PI都用“3.1415926”代替。这种方法使用户能以一个简单的名字代替一个长的字符串。

这个标识符(名字)称为“宏名”

在预编译时将宏名替换成字符串的过程称为宏展开。#define是宏定义命令

说明:

(1)宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母

(2)使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量

(3)宏定义时用宏名代替一个字符串,只做简单置换,不做正确性检查,只有在编译已被宏展开后的源程序时才会被发现语法错误并报错。

(4)宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换

(5)#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。

(6)可以用#undef命令终止宏定义的作用域

(7)在进行宏定义时,可以引用已定义的宏名,可以层层置换

例如:

1 #include

2 #define R 3.0

3 #define PI 3.1415926

4 #define L 2*PI*R

5 #define S PI*R*R

6 voidmain()7 {8 printf("L = %f \n S = %f",L,S);9 }

带参数的宏定义

作用:不是进行简单的字符串替换,还要进行参数替换

带参数的宏定义一般形式为:

#define 宏名(参数表) 字符串

字符串中包含在括弧中所指定的参数

如:#define S(a,b) a*b

2、文件包含处理

功能:一个源文件可以将另一个源文件的内容全部包含进来

一般形式:#include “文件名”  // 先在当前目录搜索,在搜索标准目录

#include     //直接按标准目录搜索

处理过程:预编译时,用被包含文件的内容取代该预处理命令,再将“包含”后的文件作为一个源文件单位进行编译,得到目标文件.obj

被包含文件的内容:

源文件(*.c)

头文件(*.h)//宏定义,数据结构定义,函数说明等

文件包含可嵌套

预编译后成为一个文件,因此file2.c中的全局静态变量在file1.c中有效,不必在用extern声明

3、条件编译

概念:所谓“条件编译”,时对部分内容指定编译的条件,使其只在满足一定条件才进行编译

条件编译命令的几种形式:

(1)#ifdef 标识符              (2)#ifndef 标识符                      (3)#if 表达式

程序段1                                  程序段1          程序段1

#else          #esle             #else

程序段2          程序段2          程序段2

#endif          #endif            #endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[你必须知道的.NET]第十一回:参数之惑---传递的艺术(上)

本文将介绍以下内容: 按值传递与按引用传递深论ref和out比较 参数应用浅析 1. 引言 接上回《第九回:品味类型---值类型与引用类型(中)-规则无边》中,对值类型和引用类型的讨论,其中关于string…

[你必须知道的.NET]第十二回:参数之惑---传递的艺术(下)

本文将介绍以下内容: 按值传递与按引用传递深论ref和out比较 参数应用浅析 接上篇继续,『第十一回:参数之惑---传递的艺术(上)』 4.2 引用类型参数的按值传递 当传递的参数为引用类型时,传递和操作的是指…

android 自定义相机源码,Android 自定义相机及分析源码

Android 自定义相机及分析源码使用Android 系统相机的方法:要想让应用有相机的action,咱们就必须在清单文件中做一些声明,好让系统知道,如下action的作用就是声明action的类型,便于Intent的使用,category的…

[你必须知道的.NET]第十三回:从Hello, world开始认识IL

本文将介绍以下内容: IL代码分析方法 Hello, world历史 .NET学习方法论1. 引言 1988年Brian W. Kernighan和Dennis M. Ritchie合著了软件史上的经典巨著《The C programming Language》,我推荐所有的程序人都有机会重温这本历史上的经典之作。从那时起…

android服务器怎么做的,[Android]Android 制作一个HTTP服务器应用

上传文件开始想用apache的开源库获取文件,但是失败了,要么文件不全,要么就完全为空,还是自己写。文件上传请求头的部分内容contentType:multipart/form-data; boundary----WebKitFormBoundaryHpUAY0qCryu0Oc7o我们需要获取boundar…

[你必须知道的.NET]第十四回:认识IL代码---从开始到现在

本文将介绍以下内容: IL代码分析方法 IL命令解析 .NET学习方法论 1. 引言 自从『你必须知道.NET』系列开篇以来,受到大家很多的关注和支持,给予了anytao巨大的鼓励和动力。俱往昔,我发现很多的园友都把…

android 获取服务对象,android 如何取得正在运行的service对象

在写有关推送的代码,用的长连接的方式。具体逻辑:登录时 启service,service中启一个线程,线程中构建一个CommunicateManegr对象,此对象里面有一个BlockingDeque双端队列处理包的顺序问题, 还有若干线程分别…

[你必须知道的.NET]第十五回:继承本质论

本文将介绍以下内容: 什么是继承?继承的实现本质1. 引言 关于继承,你是否驾熟就轻,关于继承,你是否了如指掌。 本文不讨论继承的基本概念,我们回归本质,从编译器运行的角度来揭示.NET继承中的…

海岸鸿蒙2018年标准物质,海岸鸿蒙——20年权威的标准物质研制单位

摘要:海岸鸿蒙创办于1996年,是专业从事国家标准物质研发、生产、销售的高新技术企业。海岸鸿蒙创办于1996年,是专业从事国家标准物质研发、生产、销售的高新技术企业。海岸鸿蒙自创办以来,一直秉持“以市场为导向,以科…

[你必须知道的.NET]第十六回:深入浅出关键字---using全接触

本文将介绍以下内容: using指令的多种用法using语句在Dispose模式中的应用1. 引言 在.NET大家庭中,有不少的关键字承担了多种角色,例如new关键字就身兼数职,除了能够创建对象,在继承体系中隐藏基类成员,还在…

华为双系统是鸿蒙系统吗,华为p50pro是鸿蒙系统吗-华为p50pro有双系统吗

华为p50pro的外观基本上就是延续了上一代的风格,没有什么太大的变化,不过影像能力还是非常令人期待的,下面一起来了解华为p50pro的系统方面,看看有没有你暂所不知的消息。近日,有消息曝光了华为 P50 Pro将会有 Harmony…

[你必须知道的.NET]第十七回:貌合神离:覆写和重载

本文将介绍以下内容: 什么是覆写,什么是重载覆写与重载的区别覆写与重载在多态特性中的应用1. 引言 覆写(override)与重载(overload),是成就.NET面向对象多态特性的基本技术之一,两…

鸿蒙系统正式开源,余承东:鸿蒙系统正式开源,友商也可以使用!

鸿蒙OS2.0正式开源:从PPT走向前台,该谁脸红了?在9月10日的开发者大会上,华为鸿蒙2.0发布,已经不再是某些人嘴中的PPT、又哄又蒙的鸿蒙了。说鸿蒙是PPT的言论,在前不久还能看到,如今鸿蒙已经发布…

[你必须知道的.NET]第十八回:对象创建始末(上)

本文将介绍以下内容: 对象的创建过程内存分配分析内存布局研究1. 引言 了解.NET的内存管理机制,首先应该从内存分配开始,也就是对象的创建环节。对象的创建,是个复杂的过程,主要包括内存分配和初始化两个环节。例如&…

viper4android fxifi,ViPer4android. FX顶级音效!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼名称:OPPO X903 杜比音效脉冲反馈样本 For VIPER4Android FX v2.0样本数量:72适配V4A版本:ViPER4Android FX v2.2.0.1 或更高适用范围:耳机内放制作者:漫游因特网授权&…

[你必须知道的.NET]第十九回:对象创建始末(下)

本文将介绍以下内容: 对象的创建过程内存分配分析内存布局研究接上回[第十八回:对象创建始末(上)],继续对对象创建话题的讨论>>> 2.2 托管堆的内存分配机制 引用类型的实例分配于托管堆上,而线…

android material 颜色值,Android Material Colors 谷歌 Material Design 标准颜色

Android Material Colors谷歌 Material Design 标准颜色。调色板资源文件通过 doc-getter 自动抓取生成。运行 Demo 来查看效果。UsageGradlecompile com.takwolf.android.materialdesign:color:0.0.1Stylecolor/material_indigo_500color/material_indigo_700color/material_p…

突然吐字不清_要注意说话吐字不清小心是脑中风前兆

任何疾病发病之前往往会有一些前兆出现,像是脑中风这种疾病在发作之前也是有前兆的,若是朋友们能够尽早的发现就能够在发病前进行治疗了。朋友们要注意的是说话吐字不清小心是脑中风前兆,这是脑中风发病前的典型前兆,还有头晕、呕…

[你必须知道的.NET]第二十回:学习方法论

本文,源自我回答刚毕业朋友关于.NET学习疑惑的回复邮件。 本文,其实早计划在《你必须知道的.NET》写作之初的后记部分,但是因为个中原因未能如愿,算是补上本书的遗憾之一。 本文,作为[《你必须知道的.NET》]系列的第20…

c++ vs release没有exe_未来安全 | 第一次Geant4培训总结 | 有没有你关注的问题呢?...

Geant4简介Geant4是蒙卡工具包,模拟很多粒子,记录一些统计量,用这些统计量去估计真实的物理实验的结果。蒙卡模拟程序,从最老的MCNP,到PENELOPE,FLUKA等。MCNP是用输入卡片(输入文件)实现的,在一…