目录:

一、宏定义

二、#x,##x使用和预定义宏

三、宏的高级使用(条件编译)

回到顶部

一、宏定义

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语言宏的更多相关文章

  1. C语言 宏/macor/#define/

    C语言 宏/macor/#define 高级技巧 1.在进行调试的时候,需要进行打印/PRINT,可以通过define进行自定义.例如,自己最常用的DEBUG_PRINT() #define DEBU ...

  2. C语言宏的高级应用

    原文:C语言宏的高级应用 关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号.比如 ...

  3. C 语言宏定义

    C 语言宏定义1.例子如下: #define PRINT_STR(s) printf("%s",s.c_str()) string str = "abcd"; ...

  4. 将C语言宏定义数值转换成字符串!

    将C语言宏定义转换成字符串! 摘自:https://blog.csdn.net/happen23/article/details/50602667 2016年01月28日 19:15:47 六个九十度 ...

  5. C语言宏应用-------#define STR(X) #X

    C语言宏应用-------#define STR(X) #X   #:会把参数转换为字符串 #define STR(x) #x #define MAX 100 STR(MAX) 会被扩展成" ...

  6. C语言 宏定义之可变参数

    可变参数宏定义 C99编译器标准允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏.可变参数宏就像下面这个样子: #define dbgprint(. ...

  7. C语言宏的使用

    使用条件宏进行条件编译 譬如,对于同一份代码,我想编译出两个不同的版本,在其中一个版本中去掉某一部分功能, 这时可以通过条件宏判断是否编译,例: 如果不使用条件宏进行控制,想编译两个不同版本的程序,就 ...

  8. c语言宏定义

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

  9. C语言宏定义相关

    写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等.下面列举一些成熟软件中常用得宏定义......1,防止一个头文件被重复包含#ifndef COMDEF_H# ...

随机推荐

  1. c++中自增(++)和自减(--)操作符

    自增(++)和自减(--)操作符为对象加1 或减1 操作提供了方便简短的实现方式.它们有前置和后置两种使用形式.到目前为止,我们已经使用过前自增操作,该操作使其操作数加1,操作结果是修改后的值.同理, ...

  2. FAQ:win7和win8 64位注册ocx控件方法

    win7/win8 问题所在: 64位的系统一般都是可以安装32位程序的, 执行         C:\Windows\SysWOW64\regsvr32.exe 而不是 C:\Windows\Sys ...

  3. 好博客分享 go需要运行容器? 不需要

    http://blog.csdn.net/wsl211511/article/details/51645324 粗浅看 Tomcat中设计模式分析 http://www.infoq.com/cn/ar ...

  4. gcc -lpthread 干什么用

    #include <stdio.h> #include <pthread.h> void *ThreadFunc(void *pArg)  //参数的值为123 { int i ...

  5. 游戏基础元素——Cocos2d-x学习历程(八)

    1.Director:导演 从字面上理解,这是一个"导演"类,Director是控制游戏流程的主要组件.CCDirector的工作确实跟导演非常类似,主要负责以下工作: 游戏呈现方 ...

  6. javscript上传图片前预览的方法setPreViewImage()

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. mac apktool配置

    Apktool:http://ibotpeaches.github.io/Apktool/install/ 最新版本2.0.1 dex2jar: https://github.com/pxb1988/ ...

  8. Get请求出现乱码的解决方案

    Get请求出现乱码,模拟一般出现的场景.场景一:超链接<a href=”url?name=张三&age=18”>场景二:window.opon(“url?name=张三&a ...

  9. RobotFramework环境搭建

    环境搭建 1. 准备条件 python-2.7.7 https://www.python.org/download/releases/2.7.7/ wxPython2.8-win32-unicode- ...

  10. VC6.0调试大全

    VC调试方法大全 一.调试基础 调试快捷键 F5: 开始调试 Shift+F5: 停止调试 F10:   调试到下一句,这里是单步跟踪  F11:   调试到下一句,跟进函数内部 Shift+F11: ...