首页 > 其他分享 >C--宏定义

C--宏定义

时间:2023-08-02 21:13:16浏览次数:25  
标签:文本 函数 -- define printf PI 定义

宏定义

宏定义在C语言中为#define symbol xxx,其目的是在编译的预处理阶段将相关符号做文本上的替换,应用包括:

  • 数据、字符串的简单替换
  • #include <stdio.h>
    #define PI 3.14
    int main(){
    	printf("PI = %f\n", PI);
    	return 0;
    }
    
  • 用作函数
  • #include <stdio.h>
    #define SQ(x) ((x)*(x))
    int main(){
    	float b = SQ(3.14);
    	printf("PI的平方为 = %f\n", b);
    	return 0;
    }
    

和函数的区别

二者作用都是相同的,不同之处在于,宏定义是在预处理阶段处理,而函数是编译器在编译阶段将其用作可执行程序放在内存中的某个位置,当调用该函数时,则跳转到该位置。二者的使用各有优缺点。

宏定义是以空间换时间,通过文本替换避免了函数跳转导致的多次访问内存从而引起的效率下降。而函数是以时间换空间,宏定义的文本替换可能会导致程序代码量庞大,而函数无论重用多少次,占用的空间都是确定的。同时,因为宏定义无法确定返回类型,所以也存在一定安全性的问题。

使用宏定义可能导致的优先级问题

宏定义的文本不当可能会催生一些优先级方面的问题,比如
...
#define X 2
#define Y X*(X+1)
...
printf("Y=%d\n",Y);

答案是5不是6,因为Y展开为2*2+1而不是2*(2+1),这点一定要注意,是个坑。

标签:文本,函数,--,define,printf,PI,定义
From: https://www.cnblogs.com/starkly/p/17601742.html

相关文章

  • WEB服务器
    1.web服务器也成为网页服务器或HTTP服务器2.web服务器协议是HTTP协议或https协议3.HTTP协议端口号:TCP80,HTTPS端口号:TCP443,FTP端口号:TCP234.web服务器发布软件:微软:IIS(可以发布web网站和FTP站点)Linux:Apache/LAMP/Tomacat/nginx........ 第三方:phpstudy,XAMPP(测试) FTP......
  • @Import注解
    1.代码1.Type级别注解,可以作用于类接口(包括注解类型)枚举上声明2.注解保留策略:编译后存在于class文件中,且能在运行时被虚拟机保留,所以可以反射读取3.value属性Class数组:@Configuration,ImportSelector,ImportBeanDefinitionRegistrar,或者要导入的常规组件类。可以导入@......
  • Solidity入门
    什么是Solidity?Solidity是一种用于编写智能合约的高级编程语言,主要用于以太坊平台。智能合约是一种在区块链上自动执行的计算机程序。Solidity使开发人员能够创建可靠和安全的智能合约,这些合约可以用于多种用途,例如去中心化应用(DApps)的创建、数字资产的管理等。Solidity基础......
  • [刷题笔记] Luogu P1853 投资的最大效益
    ProblemSolution刚开始看这道题的时候不自主的想到了纪念品,但其实本题和纪念品还是有区别的。纪念品规定了每次只能买一个纪念品,而本题可以买无限个纪念品需要在原本的基础上买进卖出,钱有进有出,而本题时只有进,稳赚不赔。本题和纪念品不同的第一点决定了它时完全背包,纪念品......
  • 05_llvm IR测试创建ifelse语句及多个block
    一个ifelse源码编译先看如下代码:intfunc(inta){intb;if(a>5)b=6;elseb=5;returnb;}编译命令../output/bin/clang++-emit-llvmllvm_if_else.c-S-oir.ll编译后的IR如下:;ModuleID='llvm_if_else.c'source_filename="llvm_if_else.c&q......
  • C--存储类型和特征修饰
    C语言中的存储类型和特征修饰C语言中的变量定义C语言变量定义的格式为:存储类型特征修饰数据类型变量名存储类型:决定变量的存储位置特征修饰:决定变量的特征属性数据类型:决定变量的存储空间和数据范围变量名:决定变量的引用标识一般定义变量时,前两者都是省略的,比如c......
  • 运算符
    1.算数运算符算数运算符分为:+,-,*,/,%,++,--System.out.println(5/2);//2,因为都是int类型,所以结果也是int类型,因此舍弃小数System.out.println(5/2.0);//2.5,int类型除double类型结果是double类型System.out.println(5%2);//1,商2余1System.out.println((3%7);//3,小的对大的......
  • git pull
    hint:Pullingwithoutspecifyinghowtoreconciledivergentbranchesishint:discouraged.Youcansquelchthismessagebyrunningoneofthefollowinghint:commandssometimebeforeyournextpull:hint: hint:  gitconfigpull.rebasefalse #merge(th......
  • 省选前全部笔记
    观前提醒其实也不能说是笔记,以为你看看就知道了,好多更像是日记。可以试试去调错字,因为你能挑出100个我写错的字(不带夸张)主要是分享一下我当时的精神状态,希望处在低谷的oier们也不要灰心。学术内容可以略看,因为不少是扯淡。大部分英语是chinglish,图一乐就行至于我有没有入选......
  • 8.02日
    起初,我对这种生活方式感到有点无聊和不适应,但是现在我开始逐渐享受这种简单的生活了。早上,我醒来后第一件事就是泡一杯咖啡。我喜欢静静地坐在阳台上,感受清晨的宁静。然后,我会打开电脑,开始处理一些工作上的事情。在家办公虽然有些不方便,但是至少我可以穿着舒适的衣服,不用担心交通......