带参数的宏与内联函数之间的区别
答:宏定义是C语言提供的三种预编译处理功能的一种。三种分别是文件包含、宏定义、条件编译。
格式: #define 标识符 字符串
其中的标识符就是所谓的符号常量,也成为宏名。宏是在预编译期间简单替换(是在预处理完成的),将宏名替换为字符串,也叫作宏展开。说白了,宏就是简单的字符串替换。
重要的一点是,对于带参数的宏,不作任何类型和语法的检查。
内联函数:c++支持函数内联,这是为了提高程序的效率。但是使用内联函数要注意以下几点。
1、含有递归调用的函数不能被声明为内联函数。
2、内联函数增加了代码的体积,所以内联函数的代码应该短小。
3、在一个文件中定义的内联函数不能在另一个文件中使用,它们通常放在头文件中共享。内联函数的定义和声明要放在同一个文件中。
4、内联函数体中,不能有循环结构、if语句和switch语句。
5、内联函数的定义对编译器而言必须是可见的,以便编译器能够在调用点内联展开该函数的代码。
关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。
如下风格的函数Foo 不能成为内联函数:
<span style="font-size:18px;">inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y){}</span>
如下风格的函数Foo 则成为内联函数:
<span style="font-size:18px;">void Foo(int x, int y);
inline void Foo(int x, int y){} // inline 与函数定义体放在一起</span>
inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。
定义在类声明之中的成员函数将自动地成为内联函数
class A
{
public:
void Foo(int x, int y) { } // 自动地成为内联函数
}
将成员函数的定义体放在类声明之中虽然能带来书写上的方便,但不是一种良好的编程风格,上例应该改成:
<span style="font-size:18px;">class A
{
public:
void Foo(int x, int y);
}
inline void A::Foo(int x, int y){} </span>
带参数的宏和内联函数的相同点是都是在程序出现的地方展开,内联函数不是通过函数调用实现的,是在调用该函数的程序处将它展开,带参数的宏在预编译期间展开。
不同点:内联函数可以在编译期间完成类型和语法的检查,而带参数的宏不具有这样的功能。另外,带参数的宏展开时间和内联函数展开时间是不同的。
对于宏定义注意几点
1、宏定义允许嵌套。
2、字符串中永远不能包含宏。
#define NAME "A234"
void main()
{
cout<<"NAME"<<endl;//这里的NAME不能用定义的宏替换
}
3、宏定义不分配内存,变量定义分配内存。
带有参数的宏还没有细讲,有时间再说吧。。。。。