//#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");
}

最新文章

  1. JavaWeb开发环境准备之Linux篇
  2. HDU5781 ATM Mechine(DP 期望)
  3. C#数组的声明方式
  4. websotrm注册码
  5. Topogun教学视频
  6. 3.x的触摸响应机制
  7. mysql导入导出.sql文件 备份还原数据库
  8. 从 mian 函数开始一步一步分析 nginx 执行流程(四)
  9. KineticJS教程(1-2)
  10. cmd连接mysql连接:mysql-h主机地址-u用户名-p用户密码(注:u与root可以不用加)
  11. ORACLE数据库多表关联查询效率问题解决方案
  12. C# 部分关键字
  13. &lt; high performance web sites &gt; 阅读小记
  14. CRC与MD5的异同
  15. popupwindow那些坑
  16. mac android studio 出现 Error: SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.
  17. Mycat 分布式事务的实现
  18. 时间轴QTimeLine
  19. ASP.NET MVC 实现带论坛功能的网站 第一步——-实现用户注册.
  20. 用django发送异步邮件

热门文章

  1. Python: 解决pip安装源被墙的问题
  2. 【转载】iOS堆和栈的理解
  3. 解压缩框架--SSZipArchive
  4. iOS开发网络篇—搭建本地服务器(待整理)
  5. java集合 之 Map集合
  6. linux下安装mysql手记
  7. JSON 格式介绍
  8. 【mysql】关于innodb_file_format
  9. JSON转换类(一)--过滤特殊字符,格式化字符型、日期型、布尔型
  10. Android开发之 Android应用程序详细解析