呵呵,今天在芯群面试时被问到这个题目了,记得之前刚看了宏定义的相关知识,但是在回答时对内联函数有的含糊了。回来找了些资料在总结一下。
呵呵先来上几个之之前比较有印象的几个宏,大小MIN, MAX就不提了
交换: #define SWAP(A,B) {A=A^B; B=B^A; A=A^B} //一个数按位异或两次同一个数又回来了
拼接:#define A(x) T_##x //将 T_ 和 x 拼接 eg.A(test) -> T_test
加单引号: #define B(x) #@x //给 x 加单引号 eg: B(x) -> 'x'
加双引号: #define C(x) #x //给 x 加双引号 C(test) -> "test"
内联函数是什么?
内联函数是代码被插入到调用者代码串处的函数。用inline定义的。例如: inline string dbtest(int a);
先说共同点:
如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率,就是都不会引起函数的调用,都是在调用函数的位置将函数题展开. 。一般来说,inline函数是不能递归的,尤其是内联函数能够通过调用(“过程化集成”)被编译器优化。
宏与内联函数的区别:
1.宏是在编译器预处理的时候将函数展开的;而inline函数则是在编译的时候展开的;
2.使用宏很容易产生错误,为了避免这些,在定义的时候我们是将里面每个参数括起来,最后还要一起再括起来,而inline函数则没有必要;
3.宏的参数检查比较弱,一个函数可能实用于int类型,也有可能实用于float类型;而inline函数则有较强的类型检查,实用于int就只能是int,如float想用的话,就要靠template了。
和 #define 宏不同的是,内联函数总是对参数只精确地进行一次求值,从而避免了宏错误。换句话说,调用内联函数和调用正规函数是等价的,差别仅仅是更快宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数。
C+ +编译器将内联函数的函数体扩展在函数调用的位置,使内联函数看起来象函数,却不需要承受函数调用的开销,对于一些函数体比较简单的内联函数来说,可以大大提高内联函数的调用效率。但内联函数并非没有代价,如果内联函数体比较大,内联函数的扩展将大大增加目标文件和可运行文件的大小;另外,inline关键字对编译器只是一种提示,并非一个强制指令,也就是说,编译器可能会忽略某些inline关键字,如果被忽略,内联函数将被当作普通的函数调用,编译器一般会忽略一些复杂的内联函数,如函数体中有复杂语句,包括循环语句、递归调用等。所以,内联函数的函数体定义要简单,否则在效率上会得不偿失。
另外在参考一些吧,可惜没早点看到这些
http://blogold.chinaunix.net/u/11077/showart.php?id=151918
一个内联函数的例子:
#i nclude <iostream>
#i nclude <string>
using namespace std;// No.1
inline string dbtest(int a); //定义内联函数
void main()
{
for (int i=1;i<=10;i++)
{
cout << i << ":" << dbtest(i) << endl;
}
cin.get();
}
string dbtest(int a)
{
return (a%2>0)?"y":"n";
}
No.1:
std是c++的标准命名空间,所有标准类库都包含在其中,头文件
的标识符在其中定义。using namespace std就是告诉编译器使用
标准命名空间std,程序中的所有标准类库都在std中找。
namespace 就是一个名字的空间。是为了避免名字冲突而使用的。
在不同的空间里可以使用同一个名字而不会引起名字冲突。
它的声明就像声明一个类一样。
例:
namespace A{
int f(){……};
char g(){……};
……}
在使用名字空间里函数的时候有几种方法:
1-就像声明一个类的成员函数一样,只是类名换成了空间名 A::f();
2-可以用using关键字 using namespace A; 这样以后的代码使用的
就是名字空间A中的函数了。
C++为了防止命名冲突而引进了namespace的概念,
它也将自己的标准库全部放入了std这个namespace中,
在使用标准库时,如果加上using namespace std;这
句,在以后的使用库中类、函数时就可以省略本来应该
写的std::???。