//#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)的更多相关文章

  1. C语言预处理理论-宏定义2

    宏定义21.带参宏和带参函数的区别(1)宏定义是在预处理期间处理的,而函数是在编译期间处理的.这个区别带来的实质差异是:宏定义最终是在调用宏的地方把宏体原地展开,而函数是在调用函数处跳转到函数中去执行 ...

  2. C语言预处理理论-宏定义1

    宏定义1宏定义的规则和使用解析(1)宏定义的解析规则就是:在预处理阶段由预处理器进行替换,这个替换是原封不动的替换.(2)宏定义替换会递归进行,直到替换出来的值本身不再是一个宏为止.#define M ...

  3. C语言宏定义#define用法

    #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处产生一些困惑,在编程时误用 ...

  4. 黑马程序员——C语言基础 枚举 宏定义 自定义 static exterm

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)枚举 1)枚举类型的定义 枚举是C语言中的一种基本数据类型,并不是构 ...

  5. 宏定义#define整理

    一.宏定义#define 优点:一方面可以节省程序的空间上的篇幅,另外,恰当地使用宏定义可提高程序的时间效率.代码可以写的通俗易懂.可以提高程序的清晰性.可读性,使于修改移植等. 缺点:宏定义的使用实 ...

  6. 【C++】内联函数(inline)和宏定义(# define)的优劣及其区别

    一.宏定义:# define 1.为什么要使用宏? 因为调用宏比调用函数更有效率,函数的调用必须要将程序的执行顺序转移到函数所存放的内存地址中,将函数程序内容执行完后,再返回到执行该函数前的地方,这种 ...

  7. 宏定义#define和typedef的区别和典型范例题目辨析

    宏定义#define pStr char*  ,是直接把程序中出现pStr的地方替换成char* ,直接替换: typedef  char * pStr; 是给char*定义一个别名叫做 pStr; ...

  8. C语言学习笔记--C语言中的宏定义

    1. C 语言中的宏定义 (1)#define 是预处理器处理的单元实体之一(因此,预处理器只是简单的进行替换,并不(2)#define 定义的宏可以出现在程序的任意位置(包括函数体的内部)(3)#d ...

  9. define预处理以及宏定义

    define的定义方式 无参一般形式:#define 标认符 字符串                     比如:#define COUTD "%d\n" 带参一般形式:#def ...

随机推荐

  1. android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  2. 安装并运行hadoop

    本文地址:http://www.cnblogs.com/archimedes/p/run-hadoop.html,转载请注明源地址. 欢迎关注我的个人博客:www.wuyudong.com, 更多云计 ...

  3. IOS设计模式-抽象工厂

    抽象工厂的灵活性要比简单工程的灵活性强. 抽象工厂的UML图(第一次画UML图,可能关系和箭头的图意义有错误,但是请不要以建模规范去看图,以最基本的结合后面OC代码,理解相关关系): 抽象工厂原理:抽 ...

  4. Java集合 之 Queue集合

    什么是Queue集合? 答:Queue用于模拟队列这种数据结构.队列通常是指“先进先出(FIFO)”的容器.队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素.新元素插入到队列的尾部 ...

  5. android多种布局的列表实现

    最近有一个列表效果,需要一个列表有多种布局,最终效果如下: 这个我也问了同事以及开发群里的朋友,居然都没得到最优的实现方式的回答,看来这种复杂列表的需求还是比较少的,我自己也走了一些弯路,把我几个实现 ...

  6. Android Design Support Library——Snackbar

    Snackbar是一个轻量级控件,它可以很方便的提供消息的提示和动作反馈,类似于Toast.Snackbar包括一段文字信息与一个可选的操作按钮,超时自动隐藏,也可以通过滑动来删除.效果如下所示: S ...

  7. Effective Java 71 Use lazy initialization judiciously

    Lazy initialization - It decreases the cost of initializing a class or creating an instance, at the ...

  8. 命令行方式使用abator.jar生成ibatis相关代码和sql语句xml文件

    最近接手一个老项目,使用的是数据库是sql server 2008,框架是springmvc + spring + ibatis,老项目是使用abator插件生成的相关代码,现在需要增加新功能,要添加 ...

  9. PHP开发第一个扩展

    首先声明:我们要构建的是扩展或者模块名为hello_module.该模块提供一个方法:hello_word. 一.PHP环境的搭建 1)一般使用源码包编译安装,而不是binary包安装.因为使用PHP ...

  10. jsp页面img利用tomcat配置访问服务器绝对路径显示图片

    1.打开tomcat下的server.xml文件,路径\apache-tomcat-7.0.62\conf文件夹下. 2.下<host></host>加入<Context ...