我无法理解以下行为:一个标题包含一些基本类型,另一个标题我在几个函数中使用这些类型.之后我开始根据我定义的类型和函数构建类.在函数头中,如果我留下以下签名:
void whateverFunction(parameters)
Run Code Online (Sandbox Code Playgroud)
链接器指出whateverFunction有多个定义.现在如果将其更改为:
inline void whateverFunction(parameters)
Run Code Online (Sandbox Code Playgroud)
联系问题已经消失,所有编译和链接都很好.我所知道的内联是它用它的代码替换每个函数调用,而不是它非常暗,所以我的问题是:
链接器如何处理C++中的内联函数?
通过阅读标准,我无法确定以下代码是否违反了 ODR:
// a.h
#ifndef A_HEADER_FILE
#define A_HEADER_FILE
namespace {
int v;
}
inline int get_v() { return v; }
#endif // A_HEADER_FILE
// a.cpp
#include "a.h"
void f() {
int i = get_v();
// ...
}
// b.cpp
#include "a.h"
void g() {
int i = get_v();
// ...
}
Run Code Online (Sandbox Code Playgroud)
(来源:https : //wiki.sei.cmu.edu/confluence/display/cplusplus/DCL59-CPP.+Do+not+define+an+unnamed+namespace+in+a+header+file)
据说,get_v()在每个翻译单元中引用了不同的变量,因此它违反了ODR。
这个答案:内联函数和外部链接说内联放松ODR所以我不确定为什么这仍然是一个错误?
如果这是否ODR违规,有人可以将我链接到标准中指定的位置吗?
c++ one-definition-rule inline-functions linkage language-lawyer