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# ...
随机推荐
- 汇编语言学习系列 for循环实现
假如汇编语言要实现如下C语言的功能,编译环境Ubuntu14.04(32位). #include<stdio.h> int fact_for(int n) { int i; ; ; i & ...
- javascript 验证身份证
/*身份证号码检索*/ function cardCheck(cartNo) { if (cartNo.val() === "") { return false; } else i ...
- 字节数转换为b,kb,mb,gb的方法 通用的手机流量计算方法
//通用的手机流量计算方法 private String byteToMB(long size){ long kb = 1024; long mb = kb*1024; long gb = mb*10 ...
- jquery写的tab切换效果 非常简单
自己写的一款 tab切换效果,比较简单,适合新手 <style type="text/css">*{margin:0; padding:0; font-size:12p ...
- B/S结构和C/S结构
概念: C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境 ...
- CSS自学笔记(4):CSS样式表的使用
当浏览器读到一个样式表时,浏览器会根据这个样式表来格式化html文档,从而表现出各式各样的网页. 想要浏览器读到样式表,有三种方法: 1.外部样式表 外部样式表可以理解为.CSS文件.当多个页面使用同 ...
- Python 模块的一般处理
因为Python模块在被导入时,定义在模块中的顶级代码是会被执行的!如果我们想改变这种运行方向可以这样做: if __name__ == '__main__':#当这个模块作为主程序时__name__ ...
- junwong 9个杀手级 JVM 编程语言
http://www.oschina.net/question/213217_45561
- python字符串转义与正则表达式特殊字符转义
最近在自学python,字符串和正则表达式的特殊字符转义有点混淆,做个笔记简单总结一下. 1.普通字符串转义 在字符串中使用特殊字符时,要用反斜杠(\)转义字符.例如:'Let\'s go!',这里对 ...
- React常用的命令解析
1.在目录终端下输入命令: browserify index.js -o bundle.js 该命令将require的所有文件统一打包在一个bundle.js文件中. 2.解释React文件 $ js ...