以#开头的就是预处理命令。

#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--预处理命令相关推荐

  1. C语言中 编译预处理命令的作用有哪些,C语言系列——预处理命令

    是什么? 首先介绍一下什么是预处理,在编译之前对源文件进行简单加工的过程,就称之为预处理.又因为预处理主要是处理#开头的命令,故将以#号开头的命令称为预处理命令. 做什么? 今天我们主要讨论C语言中的 ...

  2. c语言用define预处理命令定义,C语言程序设计第八章预处理命令..doc

    一.?选择题1.?对宏命令的处理是_ ___A.?在程序执行时进行的B.?在对程序中其他语句进行编译前进行的C.?在程序连接时进行的D.?与程序中其他语句同时进行编译2.?下面对编译预处理的叙述正确的 ...

  3. C语言中编译预处理命令作用,C语言预处理命令详解

    原标题:C语言预处理命令详解 关注百问科技并将它设为星标 不错过任何一篇嵌入式干货 ------ 作者:clover_toeic 原文出处: https://www.cnblogs.com/clove ...

  4. c语言有效的预处理命令,9、C语言之预处理命令(示例代码)

    预处理命令 基本概念:ANSI C标准规定可以在C源程序中加入一些"预处理命令",以改进程序设计环境,提高编程效率. 这些预处理命令是由ANSI C同一规定的,但是它们不是C语言本 ...

  5. 宏定义处理特殊字符 -_c语言编译与预处理命令

    所谓预处理,是指源文件在进行编译的第一遍扫描之前所作的工作,由预处理程序完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分进行处理,处理完毕自动进入对源程序的编译. 在前面 ...

  6. c语言里有js的预编译环节吗,C语言第十一讲,预处理命令.

    C语言第十一讲,预处理命令. 一丶预处理简介 什么是预处理,预处理就是预先处理. 我们知道,程序会经过编译,连接形成可执行文件 这些在编译之前对源文件进行简单加工的过程,就称为预处理(即预先处理.提前 ...

  7. C语言预处理命令(预处理指令)

    C语言预处理命令分为:宏定义.文件包含.条件编译 什么是预处理命令? 预处理命令属于C语言编译器,而不是C语言的组成部分 预处理命令的作用:就是在编译和链接之前,对源文件进行一些文本方面的操作,比如文 ...

  8. c语言输入输出预处理命令,C语言第十一讲,预处理命令.

    C语言第十一讲,预处理命令. 一丶预处理简介 什么是预处理,预处理就是预先处理. 我们知道,程序会经过编译,连接形成可执行文件 这些在编译之前对源文件进行简单加工的过程,就称为预处理(即预先处理.提前 ...

  9. c语言定义max和命令,C语言#define定义函数

    define是c语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便. 预处理命令以"#"号开头,如包含命令#include,宏定义命令#define等.一般都 ...

  10. C语言程序设计 细节总结(第10-11章 文件、预处理命令)

    第10章 文件 1.C语言系统把文件当成一个流,按字节进行处理 2.文件按编码方式分为二进制文件和ASCII文件(文本文件) 3.用文件指针标识文件,打开文件可取得该指针 4.对文件进行操作,打开-& ...

最新文章

  1. 摄像头PVD和CVD薄膜
  2. Struts1.x系列教程(4):标签库概述与安装
  3. 深度学习在视觉搜索和匹配中的应用
  4. 中科院计算所关于“木兰”语言问题处理情况说明
  5. 【组合数学】生成函数 ( 正整数拆分 | 无序 | 有序 | 允许重复 | 不允许重复 | 无序不重复拆分 | 无序重复拆分 )
  6. 1.14 Stream操作Collection集合
  7. mysql消除重复行的关键字_MySQL 消除重复行的一些方法
  8. PHP Cookie处理
  9. hadoop2 Ubuntu 下安装部署
  10. android 初始化语言,25.Android init language (安卓初始化语言)
  11. 关于软件系统维护的一点想法
  12. Linux下通配符总结
  13. Linux刚刚安装完anaconda,启动anaconda-navigator
  14. python比较两个文件内容是否一样_python判断两个json文件是否相等
  15. 互联网日报 | 腾讯地图全国上线聚合打车服务;国庆档首日票房突破7亿;特斯拉国产Model3再降价...
  16. Python FastAPI 微信公众号后台服务器验证
  17. 常用高性价比的LCD液晶屏驱动芯片VK1088B
  18. Android 融云即时通讯开发
  19. 中小学生计算机编程笔试,计算机编程笔试题
  20. java 正则表达式 去掉 文章头部和尾部的空格(全角,半角)、制表符、换页符

热门文章

  1. 2021年大数据Spark(十七):Spark Core的RDD持久化
  2. php7安装redis6扩展
  3. 报错Failed to initialize JPA EntityManagerFactory: Unable to create requested service解决方法
  4. Android ListView item设置分割线以及分割线宽度
  5. 7.26-Codeforces Round #372 (Div. 2)
  6. Js时间格式[转载]
  7. maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令
  8. Dwr 框架简单实例
  9. ASP.NET MVC 4 (十三) 基于表单的身份验证
  10. [ME]不知道第几次学c语言,仍觉得水深莫测