C++中inline函数的定义为什么要放在头文件中?头文件中“只定义一份”是什么意思?const object 和inline函数是“一次定义规则”
2007-11-23 10:01
951 查看
inline 可以放在 .cpp 中,但此时只有本 cpp 文件可以用它
如果要做成公用的,就必须放在 .h 中,如果不想放在 .h 中,就必须每个 cpp 文件拷贝一份。
其实,即使放在 .h 中,也是每个 cpp 文件拷贝一份的,只不过是编译器替你完成这种拷贝罢了。
inline 函数重复出现不会导致连接错误,即可以重复定义,所以是例外啦,其它函数(指可以在头文件中露面的函数)能重复定义吗?
C++ 中的 const 其实是一种特殊的变量,除了不允许你修改它的值,其它方面与变量没有任何(任何两个字应该加着重号)区别。
const 的缺省作用域是 extern。
const int x = 1234;
这种东东头文件里很常见。而且它相当于:
extern const int x = 1234;
如果把 const 去掉,就成了
extern int x = 1234;
但 extern int x = 1234; 是不允许出现在头文件里的,因为可能引起连接错误。
extern int x; 是变量声明,extern int x = 1234; 却是变量声明加定义。变量可以反复声明,只要不互相矛盾,但定义只能一次。
但是 const int x = 1234; 也同样是全局“变量”定义(如果是声明,就该是 const int x;),却可以出现在头文件里,当多个 cpp 文件包含了这个头文件,就相当于每个 cpp 文件里都有了一个“全局变量”x 的定义。这却是合法的,所以也是例外。
_---------------------------------------------------------
inline是放在函数的声明前面的.在实现的时候不要再加上了.inline只是给编译器发一个申请,告诉编译器我的这个函数想成为内联函数,编译器看具体的情况来做定夺.可能讲这个函数作为内联函数,也能不是的.
"const object 和inline函数是“一次定义规则”的例外又是什么意思?"
inline函数因为实现的时候是相当于复制一份代码到.cpp中,如果它被重复定义的话,是不会产生连接错误的.
const object的作用域仅限于当前的.cpp中.所以当你重复定义的时候其实每一个.cpp中都会出现自己的const object,没有符号冲突!
---------------------------------------------------------
在C中,定义一个const形对象是会分配空间的,并且这个空间具有全局
域,因此如果一个const定义在header中,那么如果这个header被多个c
源文件包含的话,就会产生multiply defined symbols的错误。
可以通过增加static的方式将它的连结属性变成局部的就可以了。
在C++中,const默认具有static连结域,因此在C++中可以在header中
定义const。
如果要做成公用的,就必须放在 .h 中,如果不想放在 .h 中,就必须每个 cpp 文件拷贝一份。
其实,即使放在 .h 中,也是每个 cpp 文件拷贝一份的,只不过是编译器替你完成这种拷贝罢了。
inline 函数重复出现不会导致连接错误,即可以重复定义,所以是例外啦,其它函数(指可以在头文件中露面的函数)能重复定义吗?
C++ 中的 const 其实是一种特殊的变量,除了不允许你修改它的值,其它方面与变量没有任何(任何两个字应该加着重号)区别。
const 的缺省作用域是 extern。
const int x = 1234;
这种东东头文件里很常见。而且它相当于:
extern const int x = 1234;
如果把 const 去掉,就成了
extern int x = 1234;
但 extern int x = 1234; 是不允许出现在头文件里的,因为可能引起连接错误。
extern int x; 是变量声明,extern int x = 1234; 却是变量声明加定义。变量可以反复声明,只要不互相矛盾,但定义只能一次。
但是 const int x = 1234; 也同样是全局“变量”定义(如果是声明,就该是 const int x;),却可以出现在头文件里,当多个 cpp 文件包含了这个头文件,就相当于每个 cpp 文件里都有了一个“全局变量”x 的定义。这却是合法的,所以也是例外。
_---------------------------------------------------------
inline是放在函数的声明前面的.在实现的时候不要再加上了.inline只是给编译器发一个申请,告诉编译器我的这个函数想成为内联函数,编译器看具体的情况来做定夺.可能讲这个函数作为内联函数,也能不是的.
"const object 和inline函数是“一次定义规则”的例外又是什么意思?"
inline函数因为实现的时候是相当于复制一份代码到.cpp中,如果它被重复定义的话,是不会产生连接错误的.
const object的作用域仅限于当前的.cpp中.所以当你重复定义的时候其实每一个.cpp中都会出现自己的const object,没有符号冲突!
---------------------------------------------------------
在C中,定义一个const形对象是会分配空间的,并且这个空间具有全局
域,因此如果一个const定义在header中,那么如果这个header被多个c
源文件包含的话,就会产生multiply defined symbols的错误。
可以通过增加static的方式将它的连结属性变成局部的就可以了。
在C++中,const默认具有static连结域,因此在C++中可以在header中
定义const。
相关文章推荐
- C++中inline函数的定义可放在头文件中,inline 函数重复出现不会导致连接错误,
- C++:为什么inline函数的定义要放在头文件里 + inline和宏定义的区别(暂未体会到)
- 学习笔记之C++为什么将函数声明或者类的定义放在.h文件中,而将其实现放在原文件中
- C++中模板定义与声明为什么放在同一个文件中
- c++ 模版函数的定义和实现放在一个文件中
- 模板类成员函数的定义和声明为什么要放在一个文件中
- c++模板类/模板函数的声明与定义应该放在头文件里,不要分开来写类中函数的声明与定义
- c++ 模版函数的定义和实现放在一个文件中
- 模板类成员函数的定义和声明为什么要放在一个文件中
- inline函数的定义放在头文件中
- inline函数定义放在头文件中的作用
- 为什么inline函数应该在头文件中定义?
- C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?
- 模板类成员函数的定义和声明为什么要放在一个文件中
- c++ 模版函数的定义和实现放在一个文件中 .
- C++学习:inline的函数或者成员函数一定要定义在头文件中
- c++ 模版函数的定义和实现必须放在一个文件中
- inline函数必须在头文件中定义吗?
- 【浅析】把实现放在头文件中的函数模板,为什么没有发生重定义错误
- 在C++中用虚函数的作用是什么?为什么要用到虚函数