gpt4 book ai didi

c++ - C++ 编译器如何知道类在哪里

转载 作者:搜寻专家 更新时间:2023-10-31 00:00:00 24 4
gpt4 key购买 nike

如果你定义了一个类来做某事,为了使用它你需要做的就是包含一个包含它的方法原型(prototype)的头文件(.h 文件),但你不必包含类文件本身(包含类方法实际实现的 .cpp 文件),

这是否意味着 .cpp 文件的名称必须与其头文件相同,以便编译器匹配名称来定位 .cpp 文件?

当编译器遇到函数(方法)调用时,它会转到头文件并查看它是否具有原型(prototype)。然后它在它的内置函数中搜索实现,如果没有找到它在当前目录中的所有.cpp 文件中搜索?

或者这两个假设都不成立?

最佳答案

文件名在 C++ 中是无关紧要的。 链接器 将所有部分放在一起。在编译一些 C++ 代码时,您需要知道的只是事物名称的含义。这就是声明类定义 的目的:它们引入名称,从而为编译器提供足够的信息来生成代码:

文件1.cpp:

int f(int, bool);         // declaration

class Foo; // class declaration

class Bar { int g(); }; // class definition (implies declaration)

int main()
{
Foo * p; // OK, Foo * is a complete type, since we know that
// "Foo" denotes a class

// p->h(); // Error: We don't know what Foo actually is!

Bar b; // OK, we know how size and alignment for Bar

int m = b.g(); // OK, we know what sort of function B::g() is

int n = f(50, true); // OK, we don't need to know what f does

return m + n;
}

编译上述代码时,fB::g 将包含未解析的符号。只要一个(并且只有一个)其他翻译单元包含这些符号的定义,链接器就可以解析它们并且程序可以成功链接:

file2.cpp:

int f(int n, bool b) { return b ? n * 2 : 50 - n; }

// include class definition here
int Bar::g() { return f(sizeof(Bar), sizeof(int) == sizeof(char)); }

基本规则是您可以声明一个函数或一个类或定义一个类任意多次,但您只能定义 一个函数和一个类成员函数一次。有一个异常(exception):如果您将类成员函数的函数声明为 inline,那么实际上您可以定义它,前提是所有定义都相同。

这条规则的必然结果是你可以安全地将所有函数声明和类定义放入一个头文件中并重复包含它,只要你只在一个翻译单元中提供一次实际定义。 (并且 inline 规则允许您在类定义中包含实际的成员函数定义 - 与其声明一起定义的成员函数隐式地 inline。)

关于c++ - C++ 编译器如何知道类在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14424010/

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