//#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 Small插件化框架解读——Activity注册和生命周期

    通过对嵌入式企鹅圈原创团队成员degao之前发表的<Android Small插件化框架源码分析>的学习,对Android使用的插件化技术有了初步的了解,但还是有很多需要认真学习的地方,特 ...

  2. Xcode各版本官方下载, Mac和IOS及Xcode版本历史

    官方下载, 用开发者账户登录,建议用Safari浏览器下载. 官方下载地址: https://developer.apple.com/xcode/downloads/ Xcode 7 7.2 : ht ...

  3. CoreAnimation-05-CABasicAnimation

    概述 简介 CABasicAnimation是抽象类CAPropertyAnimation的子类,可以直接使用 CABasicAnimation又称基本动画,从fromValue到toValue按照指 ...

  4. LeetCode 8 String to Integer (string转int)

    题目来源:https://leetcode.com/problems/string-to-integer-atoi/ Implement atoi to convert a string to an ...

  5. CentOS下安装实时检测网络带宽的小工具bmon

    首先下载rpmforge-release扩展的rpm包 32位操作系统:wget http://www.sudu.us/Tools/bmon/rpmforge-release-0.3.6-1.el5. ...

  6. Python文件操作之简化代码

    一朝误入此门中,从此红尘了如空.... 程序这条路,当真是路漫漫... 这两天找到一本书,名为<笨方法学Python第三版>,全实例,感觉挺好的.需要的点书名下载, 密码:gmpn 今天想 ...

  7. Effective Java 13 Minimize the accessibility of classes and members

    Information hiding is important for many reasons, most of which stem from the fact that it decouples ...

  8. MongoDB学习笔记——数据库安装及配置

    MongoDB数据库安装 MongoDB官方下载地址:https://www.mongodb.com/download-center 首先需要根据Windows版本选择正确的MongoDB版本进行安装 ...

  9. SSH服务器拒绝了密码,xshell连不上虚拟机怎么办

    用Xshell链接虚拟机的时候,出现下面情况: 这是sshd的设置不允许root用户用密码远程登录 解决方案: 修改 vim /etc/ssh/sshd_config 找到# Authenticati ...

  10. 将HTML特殊转义为实体字符的两种实现方式

    前端开发工作中,经常需要将HTML的左右尖括号等转义成实体形式.我们不能把<,>,&等直接显示在最终看到的网页里.需要将其转义后才能在网页上显示. 转义字符(Escape Sequ ...