宏的使用(C语言详解)

这篇具有很好参考价值的文章主要介绍了宏的使用(C语言详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在写一个代码生成可执行文件的过程需要经过编译和链接,编译又要经过三部:预处理,编译,汇编。

#define定义的变量和宏就是在预处理阶段会处理的。

一个简单的宏定义:

#include<stdio.h>;
#define Max(a,b) a>b?a:b
int main()
{
	int x = 4, k = 9;
	printf("%d", Max(x, k));
}

Max:宏名

a,b:宏参数

a>b?a:b:宏体

宏定义有些类似函数,Max(a,b)会被替换为 a>b?a:b

比如这里printf("%d",Max(x,k));在预处理阶段会被替换为printf("%d",x>k?x:k);

注意:在#define定义的宏或变量后面不能加分号(;)

例如: 

宏的使用(C语言详解),c语言基础,c语言,开发语言,java,c++,编辑器,青少年编程,汇编

1.运算符优先级处理

思考下面输出结果:

#define Mul(a,b) a*b
int main()
{
	int x = 4, k = 3;
	printf("%d", Mul(x, k + 2));
	return 0;
}

这里printf("%d", Mul(x, k + 2));会被替换为printf("%d",x*k+2);

所以结果为14,注意这里只是一一替换在预处理阶段进行,结果并不是20,而计算阶段是再生成的.exe后缀文件执行以后的事,所有在定义宏的时候,为了达到想要的效果我们通常在宏体里面加一些括号来避免这种问题的出现

例如:

#define Mul(a,b) ((a)*(b))

2.带副作用的宏参数

在给宏传参的时候我们尽量避免传一些前缀或后缀++ --这样的参数,这是一些带有副作用的参数

 例如:

#define Max(a,b) ((a)>(b)?(a):(b))//添加括号是解决优先级带来的潜在问题,上一个板块讲到
int main()
{
	int x = 2, k = 3;
	printf("%d", Max(++x, ++k));
}

程序执行后输出5,这里x变为3,k变为5。结果是我们无法预料的。

3.函数与宏的区别:

宏的使用(C语言详解),c语言基础,c语言,开发语言,java,c++,编辑器,青少年编程,汇编

4.宏替换的规则

在程序中扩展#define定义符号和宏时,需要涉及⼏个步骤。
1. 在调⽤宏时,⾸先对参数进⾏检查,看看是否包含任何由#define定义的符号。如果是,它们⾸先被替换。
2. 替换⽂本随后被插⼊到程序中原来⽂本的位置。对于宏,参数名被他们的值所替换。
3. 最后,再次对结果⽂件进⾏扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。
注意:
1. 宏参数和#define定义中可以出现其他#define定义的符号。但是对于宏,不能出现递归。
2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索

5.#运算符的使用

#运算符将宏的⼀个参数转换为字符串字⾯量。它仅允许出现在带参数的宏的替换列表中。
#运算符所执⾏的操作可以理解为”字符串化“。
当我们有⼀个变量 int a = 10; 的时候,我们想打印出: the value of a is 10 .
就可以写:
 

#define Print(n) printf("the value of "#n" is %d", n);
int main()
{
	int a = 0;
	Print(a);
	return 0;
}

而写作下面的形式只会打印 the value of n is 10,其中的n并不会被替换

 #define Print(n) printf("the value of n is %d", n);

6.##运算符的使用

## 可以把位于它两边的符号合成⼀个符号,它允许宏定义从分离的⽂本⽚段创建标识符。 ## 被称
为记号粘合
这样的连接必须产⽣⼀个合法的标识符。否则其结果就是未定义的。
这⾥我们想想,写⼀个函数求2个数的较⼤值的时候,不同的数据类型就得写不同的函数
比如:

int int_max(int x, int y)
{
    return x>y?x:y;
}

float float_max(float x, float y)
{
    return x>yx:y;
}

这么写很繁琐我们可以用宏定义来写函数文章来源地址https://www.toymoban.com/news/detail-849870.html

7.宏定义函数

#define Max(type) type type##_max(type x,type y)\
				  {			\
						return x>y?x:y;	\
				  }
这里\为续行符
Max(int)
Max(float)
Max(char)
int main()
{
	printf("%d\n", int_max(5, 9));
	printf("%.2f\n", float_max(5.2, 5.32));
	printf("%c\n", char_max('p', 'h'));
}

到了这里,关于宏的使用(C语言详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自然语言处理基础详解入门

    自然语言是指人类社会约定俗成的,并且区别于人工语言(如计算机程序)的语言,,是自然而然的随着人类社会发展演变而来的语言,它是人类学习生活的重要工具。 自然语言处理(Natural Language Processing, NLP)是一门以计算机为工具,对书面或口头形式的语言 进行各种处理

    2024年02月16日
    浏览(48)
  • C语言基础入门----(5)数组详解

    Tips:本文主要面向C语言初学者及新手,属于系列文章,笔者借此巩固自身同时也希望帮助更多新人更快的入门,如有不当或错误,欢迎指正。 目录 前言 一、数组的定义 1.1数组的概念         1.2数组的定义格式 1.3注意事项  1.4数组元素的访问 1.5数组的特点  1.6常见错误:

    2024年02月04日
    浏览(44)
  • 【蓝桥杯备赛Java组】第一章·语言基础|竞赛常用库函数|输入输出|String的使用|常见的数学方法|大小写转换

    🎥 个人主页:深鱼~ 🔥收录专栏:蓝桥杯 🌄欢迎 👍点赞✍评论⭐收藏 目录 一、编程基础 1.1 Java类的创建  1.2 Java方法  1.3 输入输出  1.4 String的使用 二、竞赛常用库函数 1.常见的数学方法 2.大小写转换 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,

    2024年01月19日
    浏览(72)
  • 【C语言基础】宏定义的用法详解

    📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉 📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处 ✨C语言中,一般

    2024年02月12日
    浏览(37)
  • Python语言基础---选择判断循环结构详解

    在Python编程语言中,选择判断和循环是两个非常重要的概念。它们可以让我们根据条件执行不同的代码块,或者重复执行一段代码,这为我们解决各种问题提供了强大的功能。本文将详细介绍Python语言中的选择判断和循环结构,帮助读者更好地理解和运用这些概念。 Python提供

    2024年02月13日
    浏览(68)
  • 【C语言基础】:预处理详解(一)

    一、预定义符号 在C语言中设置了许多的预定义符号,这些预定义符号是可以直接使用的,预定义符号也是在预处理阶段进行处理的。 常见的预定义符号 : 【示例】 : 我们在VS上使用 _ _ STDC _ _ 会发现显示未定义,这也就说明VS的编译器是不完全遵循 ANSI C 的,为了展示效果

    2024年04月22日
    浏览(36)
  • Prompt工程师指南[从基础到进阶篇]:用于开发和优化提示,以有效地使用语言模型(LMs)进行各种应用和研究主题

    Prompt工程是一种相对较新的学科,用于开发和优化提示,以有效地使用语言模型(LMs)进行各种应用和研究主题。Prompt工程技能有助于更好地理解大型语言模型(LLMs)的能力和局限性。研究人员使用Prompt工程来改善LLMs在各种常见和复杂任务上的能力, Prompt engineering(提示工程

    2024年02月04日
    浏览(58)
  • c语言基础知识帮助理解(详解函数)

    目录 1. 函数是什么 2. 库函数  3. 自定义函数  4. 函数参数  4.1实际参数(实参)  4.2形式参数(形参)  5.函数的调用 5.1传值调用 5.2传址调用 (传递地址) 6. 函数的嵌套调用和链式访问  6.1 嵌套调用  6.2 链式访问  7. 函数的声明和定义  7.1 函数声明  7.2函数定义 函数是

    2024年02月14日
    浏览(43)
  • c语言基础知识帮助理解(详解数组)

    前面梳理完函数和递归的知识后,来进行数组知识的梳理 对函数有疑惑的同学,可以看我之前的文章:c语言基础知识帮助理解(详解函数)_总之就是非常唔姆的博客-CSDN博客  c语言基础知识帮助理解(函数递归详解)_总之就是非常唔姆的博客-CSDN博客 想做点游戏的同学可以

    2024年02月14日
    浏览(38)
  • C语言格式化输出函数printf详解——C语言基础知识

    (由于篇幅较长,内容较全,建议收藏) printf函数的一般格式为: printf(格式控制字符串,输出值参数表); 如: 其中, f=%f,c=%fn 是 格式控制字符串 , f,c 是 输出值参数表 。 (1)格式控制字符串是用双引号括起来的字符串,包括三类信息: 格式字符。格式字符由“%”

    2023年04月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包