热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

宏调c语言,宏C语言

本文目录一览:1、c语言宏定义函数如何调用?2

本文目录一览:


  • 1、c语言宏定义函数如何调用?


  • 2、c语言中的“宏”是指什么?


  • 3、c语言中“宏”是个什么东西 有什么意义

c语言宏定义函数如何调用?

直接调用即可。如下示例:

#includestdio.h#define sum(b,c){int d=0;d=b+c;printf("两者的和:%d\n",d);}int main(){ int x=0,y=0; scanf("%d%d",x,y); sum (x,y); return 0;}使用宏函数或者宏函数时,注意如下几点:

(1)宏函数的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心。

(2)宏函数定义要注意格式,尤其是括号。

如果上面的宏函数写成 #define MAX(a, b) (ab?a:b),省去内层括号,则宏展开就成了k = (i0x0fj0x0f?i0x0f:j0x0f),运算的优先级就错了。同样道理,这个宏定义的外层括号也是不能省的。若函数中是宏替换为 ++MAX(a,b),则宏展开就成了 ++(a)(b)?(a):(b),运算优先级也是错了。

(3)宏函数往往会导致较低的代码执行效率。

 int a[]={9,3,5,2,1,0,8,7,6,4};int max(n){return n==0?a[0]:MAX(a[n],max(n-1));}int main(){max(9);return 0;}若是普通函数,则通过递归,可取的最大值,时间复杂度为O(n)。但若是宏函数,则宏展开为( a[n]max(n-1)?a[n]:max(n-1) ),其中max(n-1)被调用了两遍,这样依此递归下去,时间复杂度会很高。

c语言中的“宏”是指什么?

宏是一种预处理指令,它提供了一种机制,可以用来替换源代码中的字符串。

1、条件编译:

C语言中,预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行相应的转换,预处理过程还会删除程序中的注释和多余的空白符号。

预处理指令是以#开头的代码行,#必须是该行除了空白字符外的第一个字符。#后是指令关键字,在#和指令关键字之间允许存在若干空白字符。

使用宏进行条件编译的用法与使用宏防止多重引用类似。示例如下:

使用条件编译,方便程序员在调试程序的过程中,执行一些在程序发布后并不需要执行的指令。只要在需要调试的代码前加上_DEBUG的定义,就可以在调试程序的过程中输出调试信息。

这样方便查看程序在运行过程中有没有出现错误,定位错误出现的地方。而在程序发布之前,取消_DEBUG的定义就可以不再执行调试代码。

2、宏函数:

函数的调用是需要一定的时间和空间代价的。因为系统在调用函数时,需要保留"现场",即将程序要执行的指令的下一条指令的位置压入栈,然后转入调用函数去执行,调用完函数后再返回主调函数,恢复"现场",返回到栈里保存的的下一条指令的位置继续执行。

所以函数的调用需要额外的时间和空间代价。

而宏函数则不存在上述问题,宏函数在预编译时,同函数定义的代码来替换函数名,将函数代码段嵌入到当前程序,不会产生函数调用。

所以会省去普通函数保留现场恢复现场的时间,但因为要将定义的函数体嵌入到当前程序,所以不可避免的会占用额外的存储空间。

在频繁调用同一个宏的时候,该现象尤其明显。宏函数的示例定义如下:

#define MAX(a,b) ((a)(b)?(b):(a))

宏函数的优点在于避免函数调用,提高程序效率。

同时需要注意的是inline标识符。inline也将函数定义为内联的。但是使用内联函数需要注意的是:函数体必须十分简单,不能含有循环、条件、选择等复杂结构,否则就不能作为内联函数了。

事实上,有时候即便你没有将函数指定为内联函数,编译器也会将一些简单的函数作为内联函数处理,而对于一些复杂的函数,即使声明为内联函数,编译器也不会理会的。

inline函数的瓶颈就在于此,使用inline标识符将函数声明为内联的,但这只是一种提示,到底编译器有没有优化还依赖于编译器的实现,而使用宏函数则完全由代码本身控制。

但在使用宏函数的时候,需要明确的是宏函数只是简单的替换,需要注意括号的使用。

扩展资料:

宏的更多规则特性:

(1)宏名一般用大写。

(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义。

(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。

(4)宏定义末尾不加分号。

(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。

(6)可以用#undef命令终止宏定义的作用域。

(7)宏定义不可以嵌套。

(8)字符串" "中永远不包含宏。

(9)宏定义不分配内存,变量定义分配内存。

(10)宏定义不存在类型问题,它的参数也是无类型的。

参考资料:

百度百科--宏定义

c语言中“宏”是个什么东西 有什么意义

“宏”,就是大的意思,c语言中的宏,是一种可以代表任何语言元素的标识符。

这里还有一个概念,就是宏定义,例如:#define

A

b+c

宏定义出现在c语言的源代码中,在正式编译前,编译器会进行预处理,而预处理过程包括一个很重要的任务(当然还有其它任务),就是替换宏,这种替换是一种机械的替换,并不考虑标识符的语法,语义,也就是说当遇到上面的A时,会直接替换成b+c。

还有一种更加灵活的宏,是带参数的宏,例如:#define

F(a,b)

(a)+(b)

替换时会根据引入参数,这样,F(1,2)会被替换成(1)+(2)。


推荐阅读
  • 本文档旨在提供C语言的基础知识概述,涵盖常量、变量、数据类型、控制结构及函数定义等内容。特别强调了常量的不同类型及其在程序中的应用,以及如何正确声明和使用函数。 ... [详细]
  • 本题主要涉及输入数据的有效性验证,通过使用 C 语言中的 sscanf 和 sprintf 函数来实现数据的解析和格式化。 ... [详细]
  • 深入解析C++ Atomic编程中的内存顺序
    在多线程环境中,为了防止多个线程同时修改同一数据导致的竞争条件,通常会使用内核级同步对象,如事件、互斥锁和信号量等。然而,这些方法往往伴随着高昂的上下文切换成本。本文将探讨如何利用C++11中的原子操作和内存顺序来优化多线程编程,减少不必要的开销。 ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • 题面:P3178[HAOI2015]树上操作好像其他人都嫌这道题太容易了懒得讲,好吧那我讲。题解:第一个操作和第二个操作本质上是一样的&# ... [详细]
  • 本文详细介绍了在Luat OS中如何实现C与Lua的混合编程,包括在C环境中运行Lua脚本、封装可被Lua调用的C语言库,以及C与Lua之间的数据交互方法。 ... [详细]
  • HDU1085 捕获本·拉登!
    问题描述众所周知,本·拉登是一位臭名昭著的恐怖分子,他已失踪多年。但最近有报道称,他藏匿在中国杭州!虽然他躲在杭州的一个洞穴中不敢外出,但近年来他因无聊而沉迷于数学问题,并声称如果有人能解出他的题目,他就自首。 ... [详细]
  • GCC(GNU Compiler Collection)是GNU项目下的一款功能全面且高效的多平台编译工具,广泛应用于Linux操作系统中。本文将详细介绍GCC的特点及其基本使用方法。 ... [详细]
  • A1166 峰会区域安排问题(25分)PAT甲级 C++满分解析【图论】
    峰会是指国家元首或政府首脑之间的会议。合理安排峰会的休息区是一项复杂的工作,理想的情况是邀请的每位领导人都是彼此的直接朋友。 ... [详细]
  • 2022年4月15日的算法练习题,包括最长公共子序列和线段树的应用。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • 本文详细解析 Skynet 的启动流程,包括配置文件的读取、环境变量的设置、主要线程的启动(如 timer、socket、monitor 和 worker 线程),以及消息队列的实现机制。 ... [详细]
  • 本文介绍了一种使用链剖分(Link-Cut Tree, LCT)来维护动态树结构的方法,特别是如何通过 LCT 来高效地管理子树的信息,如子树大小等。 ... [详细]
  • 本题旨在通过实现矩阵加法,加深对多维数组的理解。题目要求读取两个 n×m 的矩阵 A 和 B,并计算它们的和。 ... [详细]
  • 汇编语言:编程世界的始祖,连C语言都敬畏三分!
    当C语言还在萌芽阶段时,它首次接触到了汇编语言,并对其简洁性感到震惊。尽管汇编语言的指令极其简单,但它却是所有现代编程语言的基础,其重要性不言而喻。 ... [详细]
author-avatar
你问什么只为她停留_538
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有