面试之简答题


带参数的宏与内联函数之间的区别

答:宏定义是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、宏定义不分配内存,变量定义分配内存。

带有参数的宏还没有细讲,有时间再说吧。。。。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值