C语言 预处理二(宏定义--#define)
//#define 宏定义(宏定义一般大写)
//知识点一-->#define的作用域:从#define开始,从上往下,如果遇到#undef就到#undef处结束,如果没有就是作用于当前整个文件 #include<stdio.h>
#include<stdlib.h>
//知识点二-->宏定义作用
//宏定义作用1:起到替换作用,可以定义常量
#define X 10 //宏定义作用2:替换代码的任意部分(一般用于易语言,或者加密代码)
#define 水乃万物之源 main //注意:宏定义不是普通C 语句,在行末不必加分号,如加上分号则连分号也一起置换
#define Y 100; //知识点三-->带参数的宏定义(可以部分替代函数调用)
//①带参数的宏仅仅是替换,不求出实际参数的值,函数调用时,会计算参数的值
//②函数调用时会给参数分配内存,宏仅仅是替换,不占用内存
//③函数有返回值的概念,宏没有返回值的概念,返回的是一个表达式,表达式的结果等价于函数的返回值
//④函数调用时是有类型的,宏替换不需要类型
//⑤宏替换展开时代码变长,函数调用不会 //函数调用时跳转,返回耗费时间,占用资源 //多个函数调用会让程序运行时间增加,不影响预处理时间
//多个宏调用,会让预处理时间增加,运行时间会短 #define FL(x) x*x //求两个数的最小数
#define MYMIN(x,y) x>y?y:x #define MYTEX(x,y) x*y
#define MYTEX2(x,y) (x)*(y) //#define MYTEX2((x),(y)) (x)*(y) 这样的宏定义是错误的,带参数的宏的参数上不可以有() //知识点四-->宏定义语句中#的作用是将参数变成字符串
#define MYTEF(x) printf("%s\n",#x)
#define MYTEF2(x) printf("%s---%d\n",#x,x) //知识点五-->在C语言的宏中,"##"被称为 连接符
//它是一种预处理运算符,用来把两个语言符号组成单个语言符号
//这里的语言符号不一定是宏的变量,"##"运算符可以将两个记号(例如标识符)“粘”在一起,成为一个记号 //例子:
#define L(x) S##x //例如L(1)就等价于S1
#define L1(x) 人##x //例如L(1)就等价于人1 #define PN(x) Etes##x //例如L(1)就等价于人1 //注意:"##"运算符不能作为第一个或者最后一个元素存在
//#define PN2(x) ##x 报错
//#define PN2(x) x## 报错(直接执行并没有错,应该##会把“报错”两个字当成一个符号) //如果带参数的宏定义比较长,可以使用'\'连接
#define MYTRE(x) if(x>1){\
printf("这个数值是大于1的啊\n");\
}\
else{\
printf("这个数值其实也并不是很大嘛\n"); \
} void go1(){
//注意:#define 不受块语句限制
#define Z 10.0
//下面的main函数中仍然可以使用Z
} void Etes1(){
printf("我是函数Etes1\n");
}
void Etes2(){
printf("我是函数Etes1\n");
} void 水乃万物之源(){
int a[X] = { };
//X = 5; 报错: 错误 1 error C2106 : “ = ” : 左操作数必须为左值 ,说明X是个常量 //printf("%d", Y);报错:错误 2 error C2059: 语法错误:“)”
//因为这里Y是100; printf("%d\n", X); printf("%d\n", Z);//打印0,因为这里Z是double类型的
//注意:宏展开只是种简单的代换,字符串中可以包含任何字符,
//可以是常数,也可以是表达式,预处理器进行宏展开时并不进行语法检查。 #undef X//结束X的宏定义
//printf("%d\n", X); 报错 //带参数的宏定义
printf("%d\n", FL()); printf("%d\n", MYMIN(,));//打印3 printf("%d\n", MYTEX(+, +));//打印22
//注意:define只会替换,所以 MYTEX(1+7, 2+7))等价于1+7*2+7
printf("%d\n", MYTEX2( + , + ));//打印72 //宏定义中#的应用
MYTEF(你好);//打印“你好”
//宏定义中#还应用于打印变量的名字
int a1 = ;
MYTEF2(a1); MYTRE() //"##"运算符的使用
int L(), L1();
//这里的L(1)就是S1
S1 = ;
人1 = ;
printf("L(1)的值是%d\n",L());
MYTEF2(L1());
//"##"运算符用于调用各种函数
PN()();
//PN(1)相当于Etes1 system("pause");
}
C语言 预处理二(宏定义--#define)的更多相关文章
- C语言预处理理论-宏定义2
宏定义21.带参宏和带参函数的区别(1)宏定义是在预处理期间处理的,而函数是在编译期间处理的.这个区别带来的实质差异是:宏定义最终是在调用宏的地方把宏体原地展开,而函数是在调用函数处跳转到函数中去执行 ...
- C语言预处理理论-宏定义1
宏定义1宏定义的规则和使用解析(1)宏定义的解析规则就是:在预处理阶段由预处理器进行替换,这个替换是原封不动的替换.(2)宏定义替换会递归进行,直到替换出来的值本身不再是一个宏为止.#define M ...
- C语言宏定义#define用法
#define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处产生一些困惑,在编程时误用 ...
- 黑马程序员——C语言基础 枚举 宏定义 自定义 static exterm
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)枚举 1)枚举类型的定义 枚举是C语言中的一种基本数据类型,并不是构 ...
- 宏定义#define整理
一.宏定义#define 优点:一方面可以节省程序的空间上的篇幅,另外,恰当地使用宏定义可提高程序的时间效率.代码可以写的通俗易懂.可以提高程序的清晰性.可读性,使于修改移植等. 缺点:宏定义的使用实 ...
- 【C++】内联函数(inline)和宏定义(# define)的优劣及其区别
一.宏定义:# define 1.为什么要使用宏? 因为调用宏比调用函数更有效率,函数的调用必须要将程序的执行顺序转移到函数所存放的内存地址中,将函数程序内容执行完后,再返回到执行该函数前的地方,这种 ...
- 宏定义#define和typedef的区别和典型范例题目辨析
宏定义#define pStr char* ,是直接把程序中出现pStr的地方替换成char* ,直接替换: typedef char * pStr; 是给char*定义一个别名叫做 pStr; ...
- C语言学习笔记--C语言中的宏定义
1. C 语言中的宏定义 (1)#define 是预处理器处理的单元实体之一(因此,预处理器只是简单的进行替换,并不(2)#define 定义的宏可以出现在程序的任意位置(包括函数体的内部)(3)#d ...
- define预处理以及宏定义
define的定义方式 无参一般形式:#define 标认符 字符串 比如:#define COUTD "%d\n" 带参一般形式:#def ...
随机推荐
- Android 开发组件
每一个应用程序都有自己独立的运行沙盒(授予应用程序代码的访问权) Android操作系统是一个多用户的Linux系统,其中的每一个应用程序都是一个独立的用户. 系统会为每一个应用程序分配一个唯一的Li ...
- Python数据结构与算法--算法分析
在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...
- ReactiveCocoa入门教程:第二部分
翻译自:http://www.raywenderlich.com/62796/reactivecocoa-tutorial-pt2 原文链接: ReactiveCocoa 是一个框架,它允许你在你的i ...
- float类型转对象 对象转float类型(一)
//float类型转化为对象CGFloat fValue = 1.f;NSNumber *objNo = [NSNumber numberWithFloat:fValue];数值.BOOL型都可以转成 ...
- Silverlight项目笔记8:层次布局、客户端读取shp、ExecuteCountAsync、柱状图、url传参
1.层次布局 由于地图窗口和菜单栏都在一个父容器内,在浏览器缩小到一定程度点击地图弹出infoWindow时,会出现菜单栏遮挡infoWindow中间部分的现象,于是通过设置Canvas.ZIndex ...
- win7操作技巧
Q : 打开文件夹默认最大化A :随便打开一个文件夹 鼠标移动到左上角 然后点击鼠标左键 选择“最大化” 后关闭 之后每次打开就是最大化了
- linux下安装mysql手记
安装mysql 下载mysql-standard-4.1.8-pc-linux-i686.tar.gz文件到目录/usr/local/下 # groupadd mysql //添加mysql用户组 ...
- 【转载】主数据管理(MDM)与元数据管理
主数据(Master Data)和元数据(Meta Data)是两个完全不同的概念.元数据是指表示数据的相关信息,比如数据定义等,而主数据是指实例数据,比如产品目录信息等.比如,某省地税开发了一套 征 ...
- (android) SharedPreferences 两种方式的存储范围
1 SharedPreferences settings =Activity.getPreferences(Activity.MODE_PRIVATE); 访问数据的范围为 当前的activity 2 ...
- oracle-表空间满了
一.查看 "sum MB", (a.bytes "used MB",b.bytes "free MB", ,) "used%&qu ...