14-C语言宏
目录:
一、宏定义
1 宏是常用的预处理功能之一,是在编译之前进行宏替换,即将宏名替换成所定义的宏体。
2 优点:可以使代码更简单,更容易,避免大量使用。
3 宏定义
定义在函数外面;
格式:#define PI 3.14
PI为宏的文件内容
在编译前将PI的内容替换成3.14
4 宏与全局变量的区别
宏相当于字符串的替换操作,内存中不存在
全局变量在内存中是存在的。
相同点:通常定义一个全局变量加上const修饰符,全局变量的值是不可以修改的。
5 宏函数
#define MianJi(r) PI*r*r
宏函数只是文本,只是相当于做了内容替换的操作,注意参数是没有数据类型
6 在声明数组时也可以使用宏
#define SIZE 10
int array[SIZE];
作业:
1)使用宏来求两个数的和、积
2)使用宏将小写字母转换成大写字母
3)使用宏求两个数的最大值
#include <stdio.h> //在编译前操作,在函数外定义宏,纯的替换操作,把宏后面的值或表达式替换使用的那个位置。gcc -E main.c查看
#define PI 3.14
#define MianJi(r1) PI*r1*r1
#define He(x,y) x+y
#define Ji(x,y) ((x)*(y))
#define SIZE 10
/*
作业:
1)使用宏来求两个数的和、积
2)使用宏将小写字母转换成大写字母
3)使用宏求两个数的最大值
*/
#define He(x,y) x+y
#define Ji(x,y) ((x)*(y))
#define Swap(x) x-('a'-'A')
#define Max(x,y) x>y?x:y int main(int argc, const char * argv[])
{
int array[SIZE];
float pi = 3.14;
float r = 2.0f;
printf("pi:%f\n",PI);
printf("area:%f\n",MianJi(r));//这里是在编译前替换操作
int i = ;
int j = ;
printf("he:%d\n",He(i, j));
printf("ji:%d\n",Ji(i, j));
printf("ji(1+2,3+4):%d\n", / Ji(+, +));//1+2*3+4 int i = ,j = ;
printf("he:%d\n",He(i, j));
printf("ji:%d\n",Ji(i, j));
printf("a:%c\n",Swap('c'));
printf("i和j的最大值:%d\n",Max(i,j));
return ;
}
二、#x,##x使用和预定义宏
1 #x 代表把x的内容转换为字符串
#define STR(x) #x
printf("%s\n",STR(10));
输出结果:10(此时是字符串10)
2 ##x 代表将标识的内容与其他内容拼接在一起成为新的标识
定义:
#define QuanJu(x) g_##x //把x自动加上前缀g_(表示全局变量)
int QuanJu(i) = 20;//相当于int g_i = 20;
使用:
printf("g_i:%d\n",g_i);
printf("g_i:%d\n",QuanJu(i));
#include <stdio.h>
#define PI 3.14
#define CHAR "hello"//字符串就加上双引号
#define A -a #define MIANJI(r) PI*r*r//宏可以嵌套,可以使用已经定义的宏
#define F1(x,y) printf("max:%d\n",x>y?x:y); #define STR(x) #x //把x转换为字符串
#define QUANJU(x) g_##x //把x自动加上前缀g_(表示全局变量)
//int g_i = 20;
int QUANJU(i) = ;//相当于int g_i = 20;
int main(int argc, const char * argv[])
{
int i = ;
//printf("%s\n",STR(10));
printf("i:%d\n",i);
printf("g_i:%d\n",g_i);
printf("pi:%f\n",PI);
//#undef PI//宏结束,只是PI宏名结束
//printf("pi:%f\n",PI);//PI的值在这就不能用了会报错
printf("g_i:%d\n",QUANJU(i));
printf("mianji:%f\n",MIANJI(i));
printf("CHAR:%s\n",CHAR);//加了双引号的宏名不予替换 int a = ;
printf("%d\n",-A);//printf("%d\n",- -a);宏替换时会隐含一空格符
#define N 5//宏可以定义在任何位置
#undef N
#define N 8//要重新定义该宏,必须先取消宏定义
#define M N+3
printf("M:%d\n",M);// F1(, );
return ;
}
3 C语言内部预定义的宏
__LINE__当前行号(__两个下划线)
__FILE__当前的文件名
__DATE__当前日期
__TIME__当前时间
__STDC__是否是C语言的标准返回值为0或1
__STDC__?"符合":"不符合";
printf("行号:%d\n",__LINE__);
printf("当前文件名:%s\n",__FILE__);
printf("当前日期:%s\n",__DATE__);
printf("当前时间:%s\n",__TIME__);
printf("是否是C 语言标准:%s\n",__STDC__?"是":"不是");
三、宏的高级使用(条件编译)
1 在代码中设置编译条件,根据编译条件进行代码的编译并运行。(跨平台)
2 在编译文件的时候传入一个参数,根据参数进行对代码有选择的编译。
命令行传参:gcc -DZHAOBENSHAN 高级宏使用.c
ZHAOBENSHAN是参数
.c中使用:
#include <stdio.h>
#define ZHAOBENSHAN 1
int main()
{
int i = ;
printf("输入菜单号:\n");
scanf("%d",&i);
#ifndef ZHAOBENSHAN //编译条件,ifndef如果没有
if (i == ) {
printf("这个菜有\n");
}else{
printf("这个菜没有\n");
}
#else
if (i == ) {
printf("这个菜没有\n");
}else{
printf("这个菜真没有\n");
}
#endif
return ;
}
3 条件指令
#if如果
#ifdef 如果定义
#ifndef 如果没定义
#elif 如果(else if)
#else 否则
#endif 结束标识
#undef 取消宏
#define定义宏
4 编译方式
根据参数编译:gcc -DXXX main.c
根据宏值(参数):#define ZHAOBENSHAN 1
根据宏"值(逻辑)"进行编译:
#if ZHAOBENSHAN == 1
练习:根据设备来生成不同的程序
iphone1~4
iphone 4s
iphone 5~5s
iphone ipad
iphone mini
#include <stdio.h>
#define DEVICE 2
int main()
{
#if DEVICE == 0
printf("ipone1and4\n");
#elif DEVICE == 1
printf("iphone4s\n");
#elif DEVICE == 2
printf("iphone5~5s\n");
#elif DEVICE == 3
printf("iphoneipad\n");
#elif DEVICE == 4
printf("iphonemini\n");
#else
printf("ipone1and4\n");
#endif
return ;
}
14-C语言宏的更多相关文章
- C语言 宏/macor/#define/
C语言 宏/macor/#define 高级技巧 1.在进行调试的时候,需要进行打印/PRINT,可以通过define进行自定义.例如,自己最常用的DEBUG_PRINT() #define DEBU ...
- C语言宏的高级应用
原文:C语言宏的高级应用 关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号.比如 ...
- C 语言宏定义
C 语言宏定义1.例子如下: #define PRINT_STR(s) printf("%s",s.c_str()) string str = "abcd"; ...
- 将C语言宏定义数值转换成字符串!
将C语言宏定义转换成字符串! 摘自:https://blog.csdn.net/happen23/article/details/50602667 2016年01月28日 19:15:47 六个九十度 ...
- C语言宏应用-------#define STR(X) #X
C语言宏应用-------#define STR(X) #X #:会把参数转换为字符串 #define STR(x) #x #define MAX 100 STR(MAX) 会被扩展成" ...
- C语言 宏定义之可变参数
可变参数宏定义 C99编译器标准允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏.可变参数宏就像下面这个样子: #define dbgprint(. ...
- C语言宏的使用
使用条件宏进行条件编译 譬如,对于同一份代码,我想编译出两个不同的版本,在其中一个版本中去掉某一部分功能, 这时可以通过条件宏判断是否编译,例: 如果不使用条件宏进行控制,想编译两个不同版本的程序,就 ...
- c语言宏定义
一. #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能理解该命令的本质,总是在此处产生一些困惑,在编程时 ...
- C语言宏定义相关
写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等.下面列举一些成熟软件中常用得宏定义......1,防止一个头文件被重复包含#ifndef COMDEF_H# ...
随机推荐
- MySqL触发器以及常用转换函数注意事项
1,触发器(http://www.cnblogs.com/zzwlovegfj/archive/2012/07/04/2576989.html) 1.MYSQL中触发器中不能对本表进行 i ...
- Set无序怎么办?
在JAVA中,提供多种不同的结构来组织对象,Set(集合)是其中的一种,本身是一个接口,其迭代时的顺序取决于其具体实现. 典型的实现包括: HashSet:哈希表是通过使用称为散列法的机制来存储信息的 ...
- 加密传输SSL协议1_OpenSSL的安装
终于在自己不断的奋斗之后,来到科大的一波考试过去了,但是为了不使自己过于放松,回顾一下之前的东西,做一下笔记.所以新开一个专题笔记: Using Apache with SSL 引入:首先我们在平时的 ...
- css书写顺序和常用命名推荐
写代码的时候有一个好的规范和顺序能够帮你节省很多时间.下文将推荐相关CSS书写顺序和规范的一些方法.这个文档将会整理进前端规范文档中,如果你有更好的意见,不妨留言告知我们. CSS书写顺序 该代码来自 ...
- Android 动画系列
Android种最常用的动画: ~1~Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转.平移.放缩和渐变) Tweene Animations 主要类: Animation ...
- 编译SASS
编译SASS sass编译有很多种方式,如命令行编译模式.sublime插件SASS-Build.编译软件koala.前端自动化软件codekit.Grunt打造前端自动化工作流grunt-sass. ...
- 从零开始PHP学习 - 第一天
写这个系列文章主要是为了督促自己 每天定时 定量消化一些知识! 同时也为了让需要的人 学到点啥~! 本人技术实在不高!本文中可能会有错误!希望大家发现后能提醒一下我和大家! 偷偷说下 本教程最后的目 ...
- MSI文件静默安装
以.net4为例,以下命令为静默安装: dotNetFx40_Full_x86_x64.exe /q /norestart /ChainingPackage FullX64Bootstrapper / ...
- 走进C标准库(2)——"stdio.h"中的fopen函数
其他的库文件看起来没有什么实现层面的知识可以探究的,所以,直接来看stdio.h. 1.茶余饭后的杂谈,有趣的历史 在过去的几十年中,独立于设备的输入输出模型得到了飞速的发展,标准C从这个改善的模型中 ...
- SQL Server用户自定义类型与统计信息
用户自定义数据类型不支持统计信息! 所以查询对它的查询会慢一些.