C语言学习(二):define和inline

#define(宏定义)标识符 替换列表(替换列表可以是数,字符串字面量,标点符号,运算符,标识符,关键字,字符常量。注意:替换列表是可以为空的) 

#define MAXTIME1000

这就定义好了一个简单的MAXTIME定义,编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。

注:define的定义更像是简单的文本替换

让我们来看下面一个列子:

#include<stdio.h>

#define   SQR(x) x*x

intmain()

{

int a;

    int k=3;

    a=++SQR(k+1);

    printf("%d ",a);

    return 0;

}

输出结果a应为9;因为define只是做简单文本的替换所以程序执行时++SQR(k+1)被改写为++k+1*k+1所以输出为9。

此外define有其他用法:

(1)define可以像函数那样接受一些参数,如下

#define max(x,y)(x)>(y)?(x):(y);

(2)define的多行定义:

define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心)

#define MACRO(arg1,arg2) do { /
/* declarations */ /
stmt1; /
stmt2; /
/* ... */ /
} while(0) /* (no trailing ; ) */
关键是要在每一个换行的时候加上一个"/"

(3)条件编译
#ifdef XXX…(#else) … #endif
例如
#ifdef DV22_AUX_INPUT
#define AUX_MODE 3 
#else
#define AUY_MODE 3
#endif
#ifndef XXX … (#else) … #endif

(4)头文件(.h)可以被头文件或C文件包含;
重复包含(重复定义)
由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。
通过条件编译开关来避免重复包含(重复定义)
例如
#ifndef __headerfileXXX__
#define __headerfileXXX__

//文件内容

#endif

摘抄自http://blog.csdn.net/benny5609/article/details/2314541

 

见过了宏让我们再来看看inline(内联)内联函数是代码被插入到调用者代码处的函数。如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。 

c/c++中的inline,使用在函数声明处,表示程序员请求编译器在此函数的被调用处将此函数实现插入,而不是像普通函数那样生成调用代码(申请是否有效取决于编译器)。一般地说,这样作的优点是省掉了调用函数的开销;缺点则是可能会增加代所生成目标代码的尺寸(二班的除外,二班情况下,inline函数甚至会返过来降低程序的性能)。

实际上,即使没有手工指定inline函数,编译器一般还会选择一些代码量较小但使用频繁的函数作为inline函数,以此作为性能优化的途径之一。

 

那么这两者之间有什么区别呢?

1、内联函数在编译时展开,而宏是由预处理器对宏进行展开

2、内联函数会检查参数类型,宏定义不检查函数参数 ,所以内联函数更安全。

3、宏不是函数,而inline函数是函数

4、宏在定义时要小心处理宏参数,(一般情况是把参数用括弧括起来)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值