目录:

一、宏定义

二、#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. IE下的bug

    断断续续的在开发过程中收集了好多的bug以及其解决的办法,都在这个文章里面记录下来了!希望以后解决类似问题的时候能够快速解决 ,也希望大家能在留言里面跟进自己发现的ie6 7 8bug和解决办法! 1 ...

  2. PHP 定时器 边输出边刷新网页

    使用定时器的时候当然想网页能够看到输出,不希望网页直接卡住,定时器结束输出一片. 要做到定时器不卡住输出,只需要两个函数就行了,看下面代码 <?php //定时器测试代码 demo //跟踪定时 ...

  3. Euclid gcd规则的证明

    Euclid 规则:如果x和y都是正整数,而且x>=y,那么gcd(x,y)=gcd(x mod y, y) 假设x和y的gcd为a,那么必然有 x=a*n1 y=a*n2(gcd(n1,n2) ...

  4. Beyond Compare设置默认为ANSI格式

    工具 -> 文件格式 -> 选中C,C++,... -> 转换 -> 外部程序(ANSI文件名) 且 编码(选“ANSI”)-> 保存 -> 关闭

  5. js设置元素readonly属性注意事项

    注意大小写,应该为:obj.readOnly = true;

  6. 关于AJAX+HTML5+ASHX进行全静态页面的数据交互

    及时总结项目中使用到的知识,知识在于积累. 1.HTML代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN ...

  7. JPEG图像密写研究(一) JPEG图像文件结构

    [转载]转载自http://www.cnblogs.com/leaven/archive/2010/04/06/1705846.html JPEG压缩编码算法的主要计算步骤如下: (0) 8*8分块. ...

  8. SQL Server 权限的分类

    SQL Server 的权限可以分三类 第一类 server 层面上的: select * from sys.fn_builtin_permissions(default) where class_d ...

  9. SQL Server 查看数据页面

    第一步: 找到表的第一页dbcc ind(db_name,table_name,-1); 例子. dbcc ind(studio,person,-1);# pageFID  是文件号   pagePI ...

  10. Apache commons (Java常用工具包)简介

    Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...