C语言:随笔7--预处理命令
以#开头的就是预处理命令。
#include<stdio.h>//标准的输入输出头文件
#define PI 3.1415925//宏定义命令
在源程序中这些命令都是放在函数之外,而且一般都是放在源文件的前面,他们称为预处理部分。(因为他们比源文件更早的被处理到)
一、无参数的宏定义
1、无参数的宏名后不带参数。
其定义的一般形式为:
#define 标识符 字符串//其中“#”表示这是一条预处理命令
凡是以“#”开头的均为预处理命令。define为宏定义命令。”标识符“为多定义的宏名。“字符串”可以是阐述、表达式、格式串等。
//例如
#define PI 3.1415926
//他的作用是指定标识符PI来代替数3.1415926.
//在百你写源程序时,所有的3.1415926都可以由PI代替,而对源程序做编译时,将由预处理程序进行宏代换,即用3.1415926表达式去置换所有的宏名PI,然后再进行编译。
不带参数的宏定义说明:
(1)宏定义是用宏名来表示一个字符串,再宏展开时又以该字符串取代宏名,这只是一种简单的替换,字符串可以是含任何字符,可以是常数,也可以是表达式,预处理程序时对他不做任何检查,如有错误,只能在编译已被宏展开后的源程序时发现。
(2)宏定义不是说明或者语句,在行末不必加分号,如加上分号则连分号也一起置换。
(3)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。#undef 标识符
(4)宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。(用双引号括起来的我们都把他当作常量字符串是要输出出来的)
(5)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开式由预处理程序层层替换。
(6)习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母。(因为习惯上规定变量名用小写)
(7)可用宏定义表示数据类型,使书写方便。
比如:#define TNTEGER int(用TNTEGER a;就表示int a;)
-----PS:宏定义表示数据类型和用typedef定义数据说明符的区别
区别:宏定义只是简单的字符串替换,是在预处理完成的,而typedef(其实是个语句,后面有分号“;”)是在编译时处理的,他不是作简单的替换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。
用以下实例作比较:
#include<stdio.h>
#define PTN1 char*//PIN1是一个char* 是一个指针形式的字符
typedef char* PIN2;//指针形式的字符为PIN2
void main()
{PIN1 x,y;//用PIN1定义x和y//3宏定义替换:char* x,y;(相当于定义x是一个指针而y是一个字符型)PIN2 a,b;//用PIN2定义a和b//4而用typedef呢使类型重命名,将char*用PIN2表示,也就是说这里相当于char* a,char* b;所以打印出来不一样printf("By #define:%d %d\n\n",sizeof(x),sizeof(y));//分别取他们的大小然后打印。1打印结果4 1printf("By typedef:%d %d\n\n",sizeof(a),sizeof(b)); //2打印结果:4 4}
(8)对“输出格式”作宏定义,可以减少书写麻烦。(比如在输出时用printf打印需要%d、%s一百遍较麻烦)
#include<stdio.h>
#define P printf
#define D "%d\n"
#define F "%f\n"void main()
{int a=5,c=8,e=11;float b=3.8,d=9.7,f=21.08;P(D F,a,b);P(D F,c,d);P(D F,e,f);}
二、带参数的宏定义
C语言允许宏带有参数,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。
对带参数的宏,在调用中,不仅要宏展开,而且要用实参去替换形参。
带参宏定义的一般形式为:
#define 宏名(形参表) 字符串//不带分号“;”
带参宏调用的一般形式为:
宏名(实参表);//带分号“;”
例如:
#define M(y) y*y+3*y//宏定义//参数是y,字符串是y*y+3*y
...
K=M(5);//宏调用//传递给的实参是5,在调用时,实参5去替换形参y。(但是这里跟函数的调用值传递是不一样的,这里是直接的替换)
实例:
#include<stdio.h>
#define MAX(a,b) (a>b?a:b)//a和b是虚有的只是一个替代的符号
void main()
{int x,y,max;//定义了类型printf("input two numbers:")scanf("%d %d",&x,&y);max=MAX(x,y);//这里替换为max=(x>y)?x,y;//上边的a和b就被x和y实参化了printf("The max is %d\n\n",max);}
带参数的宏定义说明:
(1)带参宏定义中,宏名和形参表之间不能有空格出现。比如上边就不能写为#define MAX (a,b)之间不能有空格。
(2)在带参宏定义中,形式参数不分配内存单元,因此不必做类型定义。而宏调用中的实参有具体的值。要用他的去代替形参,因此必须做类型说明。(这是与函数中的情况不同。在函数中形参和实参是两个不同的量,各有自己的作用域,(也就是说函数中定义中形参有他的变量值,实参有他的变量值)调用时要把实参值赋予形参,进行“值传递”。而在带参宏中只是符号替换,不存在值传递的问题。)(在宏中只有实参有他的作用范围)
(3)在定义宏中的形参是标识符,而宏调用中的实参可以是表达式。(何为表达式呢其实就是一个式子)
#include<stdio.h>
#define SAY(y) (y)
void main()
{int i;char say[]={73,32,108,111,118,101,32,102,105,115,104,99,46,99,111,109,3}while(say[i]){say[i]=SAY(say[i]+1);//可以是表达式(刚才打印的各个字符的ASCII码加1)}printf("\n\t%s\n\n",say);//打印出来I love fishc,com!
}
#include<stdio.h>
#define SAY(y) (y)^(y)//里边的符号^是异或的意思
void main()
{int i;char say[]={73,32,108,111,118,101,32,102,105,115,104,99,46,99,111,109,3}while(say[i]){say[i]=SAY(say[i]^say[i]);}printf("\n\t%s\n\n",say);}
(4)在宏定义中,字符串内的形参通常要用括号括起来以避免出错。(加括号避免优先级发生改变)
(5)带宏的参和带参数的函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。
三、条件编译
预处理程序提供了条件编译功能。可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。
条件编译有三种潜规则:
第一种:功能是:如果标识符已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。
#ifdef 标识符//如果有定义这个标识符的话,那么就执行程序1程序段1
#else//没有定义的话就执行2程序段2
#endif
如果没有程序段2(他为空)本格式中的#else可以没有,即可以写为:
#ifdef 标识符//如果有定义这个标识符的话,那么就执行程序程序段
#endif
第二种形式:
#ifndef 标识符//如果没有定义这个标识符的话,那么就执行程序1程序段1
#else//有定义的话就执行2程序段2
#endif
第三种形式:
#if 常量表达式//if 0下边的就不会被编译执行做注释用的多(相当于一个开关,是1就执行程序1,是0就执行程序2)程序段1
#else程序段2
#endif
C语言:随笔7--预处理命令相关推荐
- C语言中 编译预处理命令的作用有哪些,C语言系列——预处理命令
是什么? 首先介绍一下什么是预处理,在编译之前对源文件进行简单加工的过程,就称之为预处理.又因为预处理主要是处理#开头的命令,故将以#号开头的命令称为预处理命令. 做什么? 今天我们主要讨论C语言中的 ...
- c语言用define预处理命令定义,C语言程序设计第八章预处理命令..doc
一.?选择题1.?对宏命令的处理是_ ___A.?在程序执行时进行的B.?在对程序中其他语句进行编译前进行的C.?在程序连接时进行的D.?与程序中其他语句同时进行编译2.?下面对编译预处理的叙述正确的 ...
- C语言中编译预处理命令作用,C语言预处理命令详解
原标题:C语言预处理命令详解 关注百问科技并将它设为星标 不错过任何一篇嵌入式干货 ------ 作者:clover_toeic 原文出处: https://www.cnblogs.com/clove ...
- c语言有效的预处理命令,9、C语言之预处理命令(示例代码)
预处理命令 基本概念:ANSI C标准规定可以在C源程序中加入一些"预处理命令",以改进程序设计环境,提高编程效率. 这些预处理命令是由ANSI C同一规定的,但是它们不是C语言本 ...
- 宏定义处理特殊字符 -_c语言编译与预处理命令
所谓预处理,是指源文件在进行编译的第一遍扫描之前所作的工作,由预处理程序完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分进行处理,处理完毕自动进入对源程序的编译. 在前面 ...
- c语言里有js的预编译环节吗,C语言第十一讲,预处理命令.
C语言第十一讲,预处理命令. 一丶预处理简介 什么是预处理,预处理就是预先处理. 我们知道,程序会经过编译,连接形成可执行文件 这些在编译之前对源文件进行简单加工的过程,就称为预处理(即预先处理.提前 ...
- C语言预处理命令(预处理指令)
C语言预处理命令分为:宏定义.文件包含.条件编译 什么是预处理命令? 预处理命令属于C语言编译器,而不是C语言的组成部分 预处理命令的作用:就是在编译和链接之前,对源文件进行一些文本方面的操作,比如文 ...
- c语言输入输出预处理命令,C语言第十一讲,预处理命令.
C语言第十一讲,预处理命令. 一丶预处理简介 什么是预处理,预处理就是预先处理. 我们知道,程序会经过编译,连接形成可执行文件 这些在编译之前对源文件进行简单加工的过程,就称为预处理(即预先处理.提前 ...
- c语言定义max和命令,C语言#define定义函数
define是c语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便. 预处理命令以"#"号开头,如包含命令#include,宏定义命令#define等.一般都 ...
- C语言程序设计 细节总结(第10-11章 文件、预处理命令)
第10章 文件 1.C语言系统把文件当成一个流,按字节进行处理 2.文件按编码方式分为二进制文件和ASCII文件(文本文件) 3.用文件指针标识文件,打开文件可取得该指针 4.对文件进行操作,打开-& ...
最新文章
- 摄像头PVD和CVD薄膜
- Struts1.x系列教程(4):标签库概述与安装
- 深度学习在视觉搜索和匹配中的应用
- 中科院计算所关于“木兰”语言问题处理情况说明
- 【组合数学】生成函数 ( 正整数拆分 | 无序 | 有序 | 允许重复 | 不允许重复 | 无序不重复拆分 | 无序重复拆分 )
- 1.14 Stream操作Collection集合
- mysql消除重复行的关键字_MySQL 消除重复行的一些方法
- PHP Cookie处理
- hadoop2 Ubuntu 下安装部署
- android 初始化语言,25.Android init language (安卓初始化语言)
- 关于软件系统维护的一点想法
- Linux下通配符总结
- Linux刚刚安装完anaconda,启动anaconda-navigator
- python比较两个文件内容是否一样_python判断两个json文件是否相等
- 互联网日报 | 腾讯地图全国上线聚合打车服务;国庆档首日票房突破7亿;特斯拉国产Model3再降价...
- Python FastAPI 微信公众号后台服务器验证
- 常用高性价比的LCD液晶屏驱动芯片VK1088B
- Android 融云即时通讯开发
- 中小学生计算机编程笔试,计算机编程笔试题
- java 正则表达式 去掉 文章头部和尾部的空格(全角,半角)、制表符、换页符
热门文章
- 2021年大数据Spark(十七):Spark Core的RDD持久化
- php7安装redis6扩展
- 报错Failed to initialize JPA EntityManagerFactory: Unable to create requested service解决方法
- Android ListView item设置分割线以及分割线宽度
- 7.26-Codeforces Round #372 (Div. 2)
- Js时间格式[转载]
- maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令
- Dwr 框架简单实例
- ASP.NET MVC 4 (十三) 基于表单的身份验证
- [ME]不知道第几次学c语言,仍觉得水深莫测