编译没有相应头的cpp 我刚刚完成了第一个真正的C++应用程序,通过学习一些语言的书籍。 据我所知,您的cpp源文件需要cooresponding标头,但我的项目中的一个库正在构建一些不包含cooresponding标头的cpp文件。这个特定的cpp实现了一个在头中找到的类,该头具有不同的名称和许多除原始类声明之外的其他代码

编译没有相应头的cpp 我刚刚完成了第一个真正的C++应用程序,通过学习一些语言的书籍。 据我所知,您的cpp源文件需要cooresponding标头,但我的项目中的一个库正在构建一些不包含cooresponding标头的cpp文件。这个特定的cpp实现了一个在头中找到的类,该头具有不同的名称和许多除原始类声明之外的其他代码,c++,build,compilation,linker,include,C++,Build,Compilation,Linker,Include,cpp如何编译属于它不知道的类的函数 这些函数的实现是否可以独立编译,并且在使用库(包括带有类声明的头)的客户端应用程序调用相应的成员函数时可以简单地调用这些函数?如果是这种情况,客户端应用程序如何引用实现二进制文件? (我想这是链接器……但我很想澄清一下) 我预计答案可能会暴露出我对编译和编译过程的误解,我很想学习C++的这方面。谢谢大家! > P >编译C++源文件时,第一阶段进行预处理。 当到达include指令时,会找到该文件,并且该文件的全部内容(无论是什么内容)都会包含在源文件中,就

cpp如何编译属于它不知道的类的函数

这些函数的实现是否可以独立编译,并且在使用库(包括带有类声明的头)的客户端应用程序调用相应的成员函数时可以简单地调用这些函数?如果是这种情况,客户端应用程序如何引用实现二进制文件? (我想这是链接器……但我很想澄清一下)


我预计答案可能会暴露出我对编译和编译过程的误解,我很想学习C++的这方面。谢谢大家!

> P >编译C++源文件时,第一阶段进行预处理。 当到达include指令时,会找到该文件,并且该文件的全部内容(无论是什么内容)都会包含在源文件中,就好像它已写入源文件本身一样

您将能够从包含类声明的任何源文件中的类定义任何函数,这是源文件“了解”类/函数

也不要求头文件和源文件的内容有任何关系,但人们普遍认为这是一种很好的做法

每个编译单元(源文件)的实现都是独立编译的。任何函数定义都可以放在任何编译单元中,这不会有任何区别。当编译单元链接在一起时,每个声明的用法都与所有定义相匹配


除了源文件和头文件之间的1:1关系(我可以想到)之外,有些人可能会使用的另一种模式是头文件分别描述一个类,每个源文件将实现一组相关功能。但这是一个坏主意(在我看来)因为这会鼓励不同类的定义高度耦合。

这是几个问题。你应该尝试拆分这些问题

  • 声明内容的文件的名称不相关。编译器独立于预处理器读取的文件获取预处理器输出。编译器可能会使用预处理文件中的某些文件/行信息来发出更可读的诊断消息。 当您在头文件中声明一个类并将该声明复制到实现文件时,只要您不更改声明的其中一个副本,一切都可以正常工作。这是非常危险的,应该避免。任何声明都必须声明一次

  • 当你编译一个类成员函数的实现时,你会得到一个链接器可以链接到你的客户端程序的函数。一个好的工具链只能链接被访问的函数。因此你可以分离接口(在头文件中)从静态库中提供的实现。链接器会将库中的每个对象模块添加到可执行文件中,直到解析所有符号引用


  • 头文件只是文本地包含在翻译单元中。没有什么神奇之处。相反,头文件是20世纪70年代令人震惊的原始遗迹。你根本不需要头文件,这不是一个认真对待这个想法的好主意。如果你有一个翻译单元,它不向系统中的其他参与者提供任何功能那么就不需要标题了。一个很好的例子是一个包含
    main
    函数的小翻译单元。看看这个关于编译和链接的SO qn: