相关疑难解决方法(0)

内联函数链接

我无法理解以下行为:一个标题包含一些基本类型,另一个标题我在几个函数中使用这些类型.之后我开始根据我定义的类型和函数构建类.在函数头中,如果我留下以下签名:

void whateverFunction(parameters)
Run Code Online (Sandbox Code Playgroud)

链接器指出whateverFunction有多个定义.现在如果将其更改为:

inline void whateverFunction(parameters)
Run Code Online (Sandbox Code Playgroud)

联系问题已经消失,所有编译和链接都很好.我所知道的内联是它用它的代码替换每个函数调用,而不是它非常暗,所以我的问题是:

链接器如何处理C++中的内联函数?

c++ inline function

19
推荐指数
2
解决办法
7501
查看次数

由于标头中的匿名命名空间而导致 ODR 违规

通过阅读标准,我无法确定以下代码是否违反了 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

0
推荐指数
1
解决办法
128
查看次数