目录:

一、宏定义

二、#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. iOS百度推送的基本使用

    一.iOS证书指导 在 iOS App 中加入消息推送功能时,必须要在 Apple 的开发者中心网站上申请推送证书,每一个 App 需要申请两个证书,一个在开发测试环境下使用,另一个用于上线到 App ...

  2. 20151210--MVC

    package com.hanqi; import java.io.IOException; import java.sql.*; import java.text.SimpleDateFormat; ...

  3. statistics specify some columns count

    # -k1 follow the first column nr

  4. IIS怎么设置本地域名解析(本地域名测试配置)

    对于IIS相信大家都不陌生,可以用来作为网站服务器,可以解析网站内容,访问时可以用端口的方式访问,也可以用域名的方式访问.下面我就介绍一下,怎么在本地用域名的方式访问,怎么用IIS进行本地域名解析. ...

  5. php的系统常量

    认识一下系统常量 系统常量是PHP已经定义好的常量,我们可以直接拿来使用,常见的系统常量有: (1)__FILE__ :php程序文件名.它可以帮助我们获取当前文件在服务器的物理位置. (2)__LI ...

  6. HTML5学习笔记之客户端存储数据方法:localStorage(),sessionStorage()

    HTML5提供了两种在客户端存储数据的新方法: localStorage():没有时间限制的数据存储 sessionStorage():针对一个session的数据存储 下面的一个例子用localSt ...

  7. CSS转载备忘

    原文地址:http://www.cnblogs.com/coffeedeveloper/p/3145790.html#html 转载内容: 对CSS中的Position.Float属性的一些深入探讨 ...

  8. BZOJ 1143 [CTSC2008]祭祀river(二分图匹配)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1143 [题目大意] 给出一张有向图,问最大不连通点集,连通具有传递性 [题解] 我们将 ...

  9. mciSendString用法

    使用MCI API,源文件中需要包含头文件 Mmsystem.h,在Project->Settings->Link->Object/libray module中加入库 Winmm.l ...

  10. arduino循迹小车

    int MotorRight1=14; int MotorRight2=15; int MotorLeft1=16; int MotorLeft2=17; int MotorRPWM=3; int M ...