内联是否将函数/方法限制在其当前源文件的范围内
Does Inline restrict the function/method to the scope of its current source file?
假设我的程序中有以下内容,
// namespaceB.h
#include "namespaceA.h"
namespace B {
class Tree {
public:
Tree *prev;
Tree *next;
Tree *down;
A::Kind kind;
Tree();
~Tree();
};
}
// end of namespaceB.h
// Implementation details of the class are placed in namespaceB.cc
// Constructor / Desctructor defined in the namespaceB.cc file!
// Something like this,
#include "namespaceB.h"
namespace B {
inline Tree::Tree() { ... }
inline Tree::~Tree() { ... }
}
我的问题是,内联ctor/dtor是否将它们的使用限制在当前源文件中?
我认为内联只是提高效率的一种方式?
如果Tree有一个类似的memeber方法呢
Tree& Tree::operator+(Tree const& rhs);
在头文件和源文件中定义
inline Tree& Tree::operator+(Tree const& rhs) { ... }
我玩了一下,这里似乎"内联"也将Tree::operator+(…)限制在源文件的范围内
这意味着这将失败:
#include "namespaceB.h"
int main() {
B::Tree tree; // Fail to link
return 0;
}
如图所示:无法从另一个命名空间创建类的实例?
在我从类Tree的ctor/dtor中删除"inline"之后,所有内容都得到了完美的编译和链接。
有人能解释一下内联到底是干什么的吗?
谢谢,
如果将函数标记为内联,则必须将其包含在使用该函数的每个源文件中。
C++11标准是这样说的:
7.1.2/4:"应在odr使用的翻译单位,应具有在每种情况下都有相同的定义。"
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 错误:未在此范围内声明'reverse'
- 并行用于C++17中数组索引范围内的循环
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 不计算一个范围内的完美数
- 错误:"imread"未在此范围内声明
- 我在范围内未声明的错误类有问题
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 未在此范围内声明错误 'xy'
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 命名空间范围内的外部 - GCC vs clang vs msvc
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 如何仅使用 While 循环在给定范围内找到可被 7 整除的计数整数
- Socklen_t未在此范围内声明
- 错误:'[' 之前预期的非限定 id 和错误:'users'未在此范围内声明
- 查找给定范围内最长连续 1 的频率
- "Main"已在当前范围内声明
- c++ 变量在宏的扩展中没有在这个范围内声明
- 内联是否将函数/方法限制在其当前源文件的范围内