随笔 - 55  文章 - 15  trackbacks - 0
<2012年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

即保持预处理宏的效率又增加安全性,而且还能像一般成员函数一样在内里面访问自如--内联函数。
宏的优点:减少了调用函数的开销。缺点:像一个函数,但是有时会带来副作用,不能访问类成员。
内联函数:类里面的宏,但是会被编译器检查参数和返回值。同样不需要函数调用的开销。
应该把内联函数写在头文件中。当编译器看到这个定义时,它把函数类型(函数名+返回值)和函数体都放到符号表中。当使用函数时,编译器检查以确保调用时正确的,且返回值被正确使用,最后将函数调用替换为函数体。在函数定义前写上inline.
内联函数很特殊,在每个用到该函数的文件中,不会出现多个定义错误的情况。
有时候创建的类成员函数都是内联函数的时候,可以把整个类放在头文件中。
当内联函数遇到编译器
对于任意函数,编译器在它的符号表中放入函数类型(函数原型,参数,返回值)。
1. 装入符号表:当编译器看到内联函数然后对内联函数体分析没有发现错误之后,就将函数体也放入符号表。
2. 替换函数:当调用时,编译器先确保调用确,即所有参数类型必须满足,假如函数类型信息符合调用上下文(返回值也被合理利用),内联函数代码就会直接替换函数调用。
两种情况不能执行内联:
1. 函数太复杂。
2. 取函数地址。
向前引用:
class Forward
{
int i;
public:
Forward():i(0){}
int f() const { return g() + 1;}// right
int g() const { return i;}
};

c++语言规定,只有在类声明结束后,内联函数才会被计算。所以,不用担心没有声明就被调用的情况。


字符串定义和粘贴
#define TRACE(s) cerr << #s << endl; s
for(int i = 0; i <100 ; i++)
TRACE(f(i));// cerr << "f(0)" <<endl; f(0);


#define FIELD(a) char* a##_STRING; int a##_size

FIELD(one);
//char* one_string;
//int one_size;



posted on 2012-05-30 16:45 Dino-Tech 阅读(240) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理