#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、宏在定义时要小心处理宏参数,(一般情况是把参数用括弧括起来)。