我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言中#define定义的标识符和宏实例代码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言中#define定义的标识符和宏实例代码

?1.#define定义标识符

在C语言程序中,有时候会包含#define

#define可以定义标识符

也就是说可以对字符重新定义,实现代替的作用

?语法

#define  name  stuff 

就比如说:

#define MAX 1000(用MAX代替1000)

#define reg   register (用reg代替register)

?举个栗子

#include<stdio.h>
#define MAX 100
int main()
{
	printf("%d", MAX);
	return 0;
}

当代码运行的时候

在代码编译的预处理阶段 就会把宏替换为文本程序代码

代替的结果如下:

#include<stdio.h>
int main()
{
	printf("%d", 100);
	return 0;
}

?注意:#define定义标识符后面尽量不加上分号,因为如果加上的话,在替换的过程中,分号也会别替换到文本程序中,有时候会导致出现逻辑错误。

?2.#define定义宏

#define规定允许将参数替换到文本中,这样包含参数叫做#define定义宏

宏在程序中,执行的速度更快,因为相对于函数,宏没有函数的调用和返回的开销

语法:
#define SQUARE(x)   x*x

这与#define定义宏一样,都是完成替换的,不过#define定义宏后面有一个括号,包含参数

?下面用#define定义宏来实现两个数求最大值

#include<stdio.h>
#define MAX(x,y) ((x)>(y)?(x):(y))
int main()
{
	int a = 20;
	int b = 10;
	int c = MAX(a,b);
	printf("%d", c);
	return 0;
}

替换后的结果为:

#include<stdio.h>
int main()
{
	int a = 20;
	int b = 10;
	int c = a>b?a:b;
	printf("%d", c);
	return 0;
}

 在#define定义宏的时候,后面的参数尽量带上括号,使每一个参数相对独立

这样可以避免由于操作符的优先级不同,导致最终的逻辑就错了

举个栗子:

#include<stdio.h>
#define sum(x) x*x
int main()
{
	int ret = sum(3 + 3);
	printf("%d", ret);
}

如果不仔细观察的话,可能你认为的结果就是36

这个代码的计算过程为:3+3*3+3,并不是(3+3)*(3+3)

?#define替换的规则

#define定义标识符和宏时,程序会继续如下步骤

1.在定义宏时,先对参数进行检查,如果参数里包含有#define定义的标识符时,首先完成相应的替换

 

2.替换文本会随后插入到原来文本文件中,对于宏来说,参数名被他们的值所替换

 

3.最后进行检查,果然还有#define定义的符号,将重复上述的操作

 注意:

1.#define参数中可以包含其他由#define定义的标识符,但是#define不能递归

2.如果#define的参数名存在在字符串中,将不会完成替换

?#与## #的用法:

在不确定参数的情况下,可以使用 “#n” ,可以实现不同字符串的插入

效果如下:

#include<stdio.h>
#define PRINT(n) printf("the value of "#n" is %d\n",n);
int main()
{
	int a = 10;
	PRINT(a);
	int b = 20;
	PRINT(b);
    int c= 30;
    PRINT(c);
	return 0;
}

?替换后的效果为:

#include<stdio.h>
int main()
{
	int a = 10;
    printf("the value of" "a" " is %d\n",a);
	PRINT(a);
	int b = 20;
	PRINT(b);
    printf("the value of " "b" " is %d\n",b);
    int c= 30;
    PRINT(c);
    printf("the value of " "c" " is %d\n",c);
	return 0;
} 

##的用法:

#include<stdio.h>
#define CAT(Max,num) Max##nu
int main()
{
	int Maxnum = 100;
	printf("%d", Maxnum);
	return 0;
}

双##的用法可以拼接两个字符串

当然这个前提是拼接后的字符串必须产生一个合法的标识符,否则结果就是未定义的

?宏的缺点

 1.如果使用宏过多,宏定义的代码插入到程序中,会大幅度增加程序的长度

2.宏是没法调试的

3.宏与类型无关,导致程序不够严谨

4.宏会带来优先级的问题,容易导致程序的错误

 ?宏和函数的优缺点      

1).在代码长度角度上,因为宏是直接替换所以若宏较长会增加代码长度

2).在执行速度上,宏较函数快,因为函数存在调用/返回时的额外开销

3).在参数求值方面,define定义的宏可能会具有副作用会导致修改变量最后的值,而函数即使调用多次也不会修改变量原来的值

4).在参数类型方面,宏与类型无关,所以宏是可以传参数的而函数不行在C中函数是不可以传类型的

 5).在是否可调试方面,宏不可调试,函数可调试宏可以传类型的检测,实现malloc(动态开辟内存的函数)

#include<stdio.h>
#include<stdlib.h>
#define MALLOC(COUNT,TYPE)\
    (TYPE *)alloc(COUNT*sizeof(TYPE))
void *alloc(int sz)   //宏可以传类型,函数不可以传类型
{
    void *p=malloc(sz);
    if(p == NULL)
    {
        printf("out of memory\n");
        exit(EXIT_FAILURE);
    }
    return p;
}
int main()
{
    int i=0;
    int *p=MALLOC(10,int);
    for(i=0;i<10;i++)
    {
        *(p+i)=i;
    }
    for(i=0;i<10;i++)
    {
        printf("%d ",*(p+i));
    }
    free(p);
    system("pause");
    return 0;
}

总结

到此这篇关于C语言中#define定义的标识符和宏的文章就介绍到这了,更多相关C语言#define定义标识符和宏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言中#define定义的标识符和宏实例代码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录