理解C++;从Java/C的角度看编译器 我是一个经验丰富的java/C程序员,最近开始学习C++。问题是,我很难理解如何构造各种头文件和代码文件。这似乎主要是因为我对编译器如何将所有内容链接在一起缺乏理解。我试过阅读一些教科书,但我的Java和C#知识深深影响了我的先入之见。例如,我很难理解这样一个事实,即方法等可以在名称空间中定义,而不仅仅是在类定义中定义 我发现了大量的C++ -java/C语言指南,但实际上没有什么可以去做。有没有什么好的资源可以用来简化java/C++语言的> C++转换,尤其是理解编译过程?

理解C++;从Java/C的角度看编译器 我是一个经验丰富的java/C程序员,最近开始学习C++。问题是,我很难理解如何构造各种头文件和代码文件。这似乎主要是因为我对编译器如何将所有内容链接在一起缺乏理解。我试过阅读一些教科书,但我的Java和C#知识深深影响了我的先入之见。例如,我很难理解这样一个事实,即方法等可以在名称空间中定义,而不仅仅是在类定义中定义 我发现了大量的C++ -java/C语言指南,但实际上没有什么可以去做。有没有什么好的资源可以用来简化java/C++语言的> C++转换,尤其是理解编译过程?,c#,java,c++,compiler-construction,transition,C#,Java,C++,Compiler Construction,Transition,这是我第一次使用C时也感到困惑。书籍在描述头文件与代码文件的正确使用方面做得不好 编译器通过加载每个.cpp文件并独立于所有其他文件进行编译来工作。编译的第一步是加载#include语句引用的所有头。您可以考虑在包含“foo.h”的地方插入整个foo.h的文本 这对如何构建文件有什么影响?头文件应该包含其他.cpp文件引用所需的程序的任何部分。一般来说,实现不应该在头文件中。这会引起问题。头文件应该包括类、函数和全局变量的声明(如果必须使用它们) > P>是一个关于C++所有特性的极好资源,但它

这是我第一次使用C时也感到困惑。书籍在描述头文件与代码文件的正确使用方面做得不好

编译器通过加载每个.cpp文件并独立于所有其他文件进行编译来工作。编译的第一步是加载#include语句引用的所有头。您可以考虑在包含“foo.h”的地方插入整个foo.h的文本


这对如何构建文件有什么影响?头文件应该包含其他.cpp文件引用所需的程序的任何部分。一般来说,实现不应该在头文件中。这会引起问题。头文件应该包括类、函数和全局变量的声明(如果必须使用它们)

> P>是一个关于C++所有特性的极好资源,但它可能比你所期望的要先进一点——大多数问题(不仅仅是答案)都是神秘的,甚至是对经验丰富的C++开发人员的。 我想如果你用谷歌做C++教程,你就能找到一些东西。您也可能想尝试学习汇编语言(或者至少快速了解微处理器中的事情是如何发生的),因为C和C++在它们做事的方式上都非常接近硬件。这就是它们的速度和能力的来源,但这是以Java提供的一些更好的抽象为代价的

我可以试着回答你上面提出的具体问题,但我不知道我能做得多好

理解头文件和cpp文件之间关系的关键之一是理解“翻译单元”的概念。Java类文件可以被视为翻译单元,因为它是编译成二进制形式的基本单元。在C++中,几乎每个CPP文件都是一个翻译单元(如果你做了奇怪的事情,就有例外)。 头文件可以包含在多个翻译单元中(并且必须包含在使用头文件中定义的内容的任何地方)。#include指令实际上只是进行文本替换——包含文件的内容被逐字插入到#include指令所在的位置。您通常希望在头文件中定义类接口,并在cpp文件中定义实现。这是因为您不想将您的实现细节公开给可能包含标头的其他翻译单元。在C++中,包括类的所有东西都不是真正的富对象,而是编译器分配的意思的内存块。通过将相同的头信息编译到每个翻译单元中,编译器保证所有翻译单元对内存块表示的内容有相同的理解。由于编译后缺少丰富的数据,反射之类的事情是不可能的

C++构建过程中的第二步是链接,链接器是在所有编译的翻译单元中查找符号(通常是函数调用,但也是变量),用于翻译单元,但没有定义。然后,它寻找另一个定义该符号的翻译单元,并将它们“链接”在一起,以便对特定函数的所有调用都指向定义该符号的翻译单元

对于类方法,必须通过类实例调用它们,类实例在幕后只是指向内存的指针。当编译器看到这些类型的方法调用时,它输出调用函数的代码,隐式地将指针(称为
this
指针)作为第一个参数传递给函数。您可以拥有不属于类的函数(而不是方法,正如您所说,因为方法实际上是类的成员函数,因此没有类就无法存在),因为链接器没有类的概念。它将看到一个定义函数的转换单元和另一个调用函数并将它们连接在一起的转换单元


结果比我预期的要长得多,当然过于简单化了,但就我所知和提供的详细程度而言,它是准确的。。。希望对你有所帮助。至少它应该给你一些Google的起点。

< P>我实际上建议远离C++编译器的解释,并在C编译器上解释解释。根据我的经验,这些问题会得到更好的解释,并避免将您与OOP问题混淆。查找有关C单独编译的资料。我本想让你看看我母校的一本很棒的幻灯片小册子,但它不是英文的

C编译与Java/C#之间的主要区别在于编译不会创建解析实体。换句话说,当您在Java中编译时,编译器会查找任何引用类的已编译类文件,并确保所有内容都可用且一致。基本假设是,当您最终运行程序时,这些文件也将可用

汇编