gpt4 book ai didi

c++ - 为什么在头文件中定义类有效但函数无效

转载 作者:太空狗 更新时间:2023-10-29 23:30:09 25 4
gpt4 key购买 nike

我有这么一小段代码:

文件modA.h
#ifndef MODA
#define MODA

class CAdd {
public:
CAdd(int a, int b) : result_(a + b) { }

int getResult() const { return result_; }

private:
int result_;
};

/*
int add(int a, int b) {
return a + b;
}
*/
#end
文件 calc.cpp
#include "modA.h"

void doSomeCalc() {
//int r = add(1, 2);
int r = CAdd(1, 2).getResult();
}
文件main.cpp
#include "modA.h"

int main() {
//int r = add(1, 2);
int r = CAdd(1, 2).getResult();
return 0;
}

如果我理解得很好,我们不能在头文件中定义一个函数并在不同的单元翻译中使用它(除非该函数被声明为静态的)。宏 MODA 不会在每个单元翻译中定义,因此 body guard 不会阻止标题被复制以代替每个 #include "modA.h"。这会导致在不同的地方定义函数,链接器会提示它。是否正确?

但是为什么可以用一个类和一个类的方法来做到这一点。为什么链接器不提示它?不就是重新定义了一个类吗?

谢谢

最佳答案

当成员函数定义在类定义体中时,它们默认是内联。如果您在 .h 文件中限定非成员函数 inline,它将正常工作。

如果没有 inline 限定符,在 .h 文件中定义的非成员函数将在包含 .h 文件的每个 .cpp 文件中编译。这违反了标准中的以下规则:

3.2 One definition rule

3 Every program shall contain exactly one definition of every non-inline function or variable that is odr-used in that program; ...

如果您在 .h 文件中的类定义主体之外定义成员函数并且没有显式添加 inline 限定符,您将得到同样的错误。

关于c++ - 为什么在头文件中定义类有效但函数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29526585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com