宏定义-C语言基础学习笔记

  • 预处理命令:
    常见的预处理命令有:
 #define
 #include
 #ifndef
  • 宏定义分类,大致分两种:
    类似对象的宏定义:
#define MAXSZIE 10000

带参数的宏:

 #define add(x,y) x+y
  • 宏表达式的调用:
    类似于普通函数间的调用:
#define plus(x,y) add(x,y)
#define add(x,y) ((x)+(y))
//调用:
plus(plus(a,b),c);

//调用结果:就是按照顺序嵌套:
//最终=((c)+(((b)+(a)))
  • 取消宏定义:
#undef name
  • 重新定义宏:
    #define NULL 0
    #define NULL -1
    //当然也可以对带参数的宏进行重定义,不过必须保证格式完全相同
    //并不推荐这样做
  • 宏展开的优先级错误–易错!
#define Square(x) x*x
#define square(x) (x)*(x)

//上述两个定义的区别体现在当x是一个表达式的时候:比如 
Square(3+a)
//得到 3+a*3+a

square(3+a)
//(3+a)*(3+a)

//另外,还要注意宏定义和++运算符联系在一起的时候,上述两个函数的含义又不一样了,取决于不同的编译器

a=3;
b=Square(a++);
c=square(a++);

//b得到的可能是3×3,结束后a=4;
//而c得到的可能是3×4,结束后a=5
  • 使用ifndef避免错误
    为了防止在不知道的情况下重定义,我们应该使用如下判断语句:
#ifndef maxsize
#define maxsize 20

#endif
  • 普通函数和define的区别
    为什么我应该用内联函数?而不是原来清晰的 #define 宏?

因为#define宏定义函数是在四处是有害的:
和 #define 宏不同的是,内联函数总是对参数只精确地进行一次求值,从而避免了那声名狼藉的宏错误。换句话说,调用内联函数和调用正规函数是等价的,差别仅仅是更快:
// 返回 i 的绝对值的宏

#define unsafe(i) ( (i) >= 0 ? (i) : -(i) )

// 返回 i 的绝对值的内联函数
inline
int safe(int i)
{
return i >= 0 ? i : -i;
}

int f();

void userCode(int x)
{
int ans;

ans = unsafe(x++); // 错误!x 被增加两次
ans = unsafe(f()); // 危险!f()被调用两次

ans = safe(x++); // 正确! x 被增加一次
ans = safe(f()); // 正确! f() 被调用一次
}

和宏不同的,还有内联函数的参数类型被检查,并且被正确地进行必要的转换。
宏定义复杂函数是有害的;非万不得已不要用

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、C语言自我YY1)、C语言是许多高级计算机语言的基础,学好C语言能更好的学习其他高级语言,为以后的学习基础;往深学C语言的话那就是学到C在Linux里的应用,Linux十分强大。2)、C语言是一种计算机程序设计语言。具有高级语言的特点,又具有汇编语言的特点。C语言可作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。3)、应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。具体应用比如单片机以及嵌入式系统开发。4)、C语言是面向过程语言,C语言通过windows/linux平台下编译的,是直接运行在windows/linux平台下的,而XX始终是运行在他的虚拟机之上的;所以理论上C语言能做一些相对于比较底层的工作,像XX就不能编写Windows病毒。5)、如果要利用编程来做一些windows优化工作的话,建议还是利用C语言C语言是目前世界上流行、使用最广泛的高级程序设计语言6、很多编译器,几乎所有操作系统Windows,Linux,Unix的大部分代码都是C,C在背后做了很多东西的,也许开发游戏用C++,安卓用XX更为合适,图形界面的用其他语言开发效率更高一些(因为他们封装了很多东西),但同样的原因导致略微接近底层的功能其他语言根本干不了!Windows的API都是按照C语言的格式给的,这也很能说明问题!嵌入式开发更是离不了C语言!纵观电脑发展几十年,C语无所不能呀!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值