从 Java / C# 角度理解 C++ 编译器

2024-04-23

我是一名经验丰富的 Java / C# 程序员,最近开始学习 C++。问题是,我无法理解如何构建各种头文件和代码文件。这似乎主要是由于我对编译器如何将所有内容链接在一起缺乏了解。我尝试阅读一些教科书,但我的先入之见受到我的 Java 和 C# 知识的影响。例如,我很难理解这样一个事实:方法等可以在命名空间中定义,而不仅仅是在类定义中。

我找到了大量 C++ -> Java/C# 指南,但几乎没有找到相反的指南。是否有任何好的资源可以简化 Java/C# -> C++ 过渡,特别是在理解编译过程方面?


The C++ FAQ http://web.tiscali.it/fanelia/cpp-faq-en/是关于 C++ 所有特性的优秀资源,但它可能比您正在寻找的更高级一些 - 即使对于相当有经验的 C++ 开发人员来说,大多数问题(不仅仅是答案)都是神秘的。

我想如果你用谷歌搜索 C++ 教程,你就能找到一些东西。您可能还想尝试学习汇编语言(或者至少快速了解微处理器中的实际情况),因为 C 和 C++ 的工作方式都非常接近硬件。这就是它们的速度和能力的来源,但它是以 Java 提供的一些更好的抽象为代价的。

我可以尝试回答您上面提出的具体问题,但我不知道我会做得如何。

理解头文件和 cpp 文件之间关系的关键之一是理解“翻译单元”的概念。 Java 类文件可以被视为翻译单元,因为它是编译为二进制形式的基本单元。在 C++ 中,几乎每个 cpp 文件都是一个翻译单元(如果您正在做奇怪的事情,也有例外)。

头文件可以包含在多个翻译单元中(并且必须包含在使用头文件中定义的任何内容的任何地方)。 #include 指令实际上只是进行文本替换——包含文件的内容逐字插入#include 指令所在的位置。您通常希望在头文件中定义类接口,并在 cpp 文件中定义实现。这是因为您不想将实现细节暴露给可能包含标头的其他翻译单元。在 C++ 中,包括类在内的所有内容都不是真正丰富的对象,而只是编译器为其分配含义的内存块...通过将相同的标头信息编译到每个翻译单元中,编译器保证所有翻译单元都具有对内存块代表什么有同样的理解。由于编译后缺乏丰富的数据,像反射这样的事情是不可能的。

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

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

结果比我预期的要长得多,当然是过于简单化了,但据我所知和所提供的详细程度来说,它是准确的……希望它能对一些人有所帮助。至少它应该为您提供一些谷歌搜索的起点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Java / C# 角度理解 C++ 编译器 的相关文章

  • 我们什么时候应该在.NET中使用NativeMemory.Alloc()? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 NET6 C 引入NativeMemory类 但我不知道什么时候应该使用NativeMemory Alloc 而不是普通的数组实例化
  • .class 与 .java

    class 文件和 java 文件有什么区别 我正在尝试让我的小程序工作 但目前我只能在 Eclipse 中运行它 还不能嵌入 HTML 谢谢 编辑 那么如何使用 JVM 进行编译呢 class 文件是编译后的 java 文件 java 都
  • Java中的DRY原则[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我一直在读关于DRY https en wikipedia org wiki Don 27t repeat yourself原则 虽然看起来
  • 如何按名字和姓氏排序,然后按 SamAccountName 排序,其中并非所有姓名都有名字和姓氏?

    目前 我有以下内容 来自 LDAP Get context based on currently logged on user PrincipalContext domainContext new PrincipalContext Cont
  • Mule/码头设置

    我有一个正在运行的 Mule 应用程序 我想在其上设置 Jetty 来响应 http 请求 以下配置
  • 使用 Maven 3 时 Cobertura 代码覆盖率为 0%

    读完这篇文章后 将 Cobertura 与 Maven 3 0 2 一起使用的正确方法是什么 https stackoverflow com questions 6931360 what is the proper way to use c
  • Android 中的字符串加密

    我正在使用代码进行加密和加密 它没有给出字符串结果 字节数组未转换为字符串 我几乎尝试了所有方法将字节数组转换为字符 但没有给出结果 public class EncryptionTest extends Activity EditText
  • 防止 Firebase 中的待处理写入事务不起作用

    我的目标是在单击按钮时将名称插入 Cloud Firestore 中 但如果用户未连接到互联网 我不希望保存处于挂起状态 我不喜欢 Firebase 保存待处理写入的行为 即使互联网连接已恢复 我研究发现Firebase 开发人员建议使用事
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • PowerShell 与 MongoDB C# 驱动程序方法不兼容?

    由 C 泛型引起的最新 MongoDB 驱动程序的问题 Cannot find an overload for GetCollection and the argument count 1 我可能可以使用其他没有泛型的 GetCollect
  • C# 从今天起 30 天

    我需要我的应用程序从今天起 30 天后过期 我会将当前日期存储在应用程序配置中 如何检查应用程序是否已过期 我不介意用户是否将时钟调回来并且应用程序可以正常工作 用户太愚蠢而不会这样做 if appmode Trial string dat
  • Java的hashCode可以为不同的字符串产生相同的值吗?

    使用java的哈希码函数是否可以为不同的字符串提供相同的哈希码 或者如果可能的话 其可能性的 是多少 Java 哈希码是 32 位 它散列的可能字符串的数量是无限的 所以是的 会发生冲突 百分比是没有意义的 项目 字符串 的数量是无限的 而
  • 监控 Java 应用程序上的锁争用

    我正在尝试创建一个小基准 在 Groovy 中 以显示几个同步方法上的高线程争用 当监控自愿上下文切换时 应该会出现高争用 在 Linux 中 这可以通过 pidstat 来实现 程序如下 class Res private int n s
  • C# XML 反序列化。将节点中的所有内部文本读取到字符串属性中

    我目前正在尝试修改我的类 以便我的模型上的文本属性包含某个节点的所有内部文本 text node 给我带来问题的 xml 示例是
  • 为什么在 C++ 类中的数据成员上使用像 m_ 这样的前缀?

    许多 C 代码使用语法约定来标记数据成员 常见的例子包括 m memberName对于公共成员 在所有使用公共成员的情况下 memberName对于私人会员或所有会员 其他人尝试强制使用this gt member每当使用数据成员时 根据我
  • 从 git 签出后 nuget dll 丢失

    I have a C solution containing different projects On those projects I have some normal nuget packages like Newtonsoft Js
  • 将隐藏(生物识别)数据附加到 pdf 上的数字签名

    我想知道是否可以使用 iText 我用于签名 或 Java 中的其他工具在 pdf 上添加生物识别数据 我会更好地解释一下 在手写板上签名时 我会收集签名信息 例如笔压 签名速度等 我想将这些信息 java中的变量 与pdf上的签名一起存储
  • 在地图上使用 find

    如何使用 find 和 aconst iterator如果你有一个地图定义为 typedef std pair
  • 如何使用 Spring AOP 建议静态方法?

    在执行类的静态方法之前和之后需要完成一些日志记录 我尝试使用 Spring AOP 来实现这一点 但它不起作用 而对于正常方法来说它起作用 请帮助我理解如何实现这一点 如果可以使用注释来完成 那就太好了 也许您应该在使用 Spring AO
  • C#“var”关键字在 VB.NET 中的等价物是什么?

    例如 我如何获得 VB NET静态类型局部变量是static赋值右侧的表达式的类型 像这样 Dim http msdn microsoft com en us library 7ee5a7s1 aspx我的变量 3 你还需要 选项推断 ht

随机推荐