关于编译器如何由.h找到.cpp的问题

pywepe 2010-01-02 09:44:59
场景:
有一个类A,声明在A.h里,实现在A.cpp里
自然地,在A.cpp里有一句 #include"A.h",而在A.h里没有任何关于A.cpp的描述.

然后,一个main.cpp文件,#include"A.h",调用类A的一个方法

想问的是 编译器怎么知道类A的实现在A.cpp里?

又如: #include<iostream>
编译器又怎么找到iostream对应的cpp文件?

iostream对应的cpp应该是已经编译好的吧,编译器不可能说把stl库全部重新编译一遍然后才能找出iostream在哪个cpp实现的吧,那编译器是怎么做的呢??
...全文
980 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复 1
[Quote=引用 9 楼 pywepe 的回复:]
引用 7 楼 arong1234 的回复:
1. 编译器从来不根据.h去找cpp文件
2. 当编译器编译一个包含了一个类A的头文件a.h的cpp的时候,它不需要知道类A的具体实现是什么,它只需要A的定义:包括a)A有那些成员变量、这些变量的类型是什么 b)A有哪些成员函数,其原型是什么。而这些在a.h中全部有,它不需要a.cpp

3. 当所有cpp文件都被编译后,a.cpp内的所有实现被放到一个叫“符号表”的地方。在链接时,所有cpp的内容都在哪儿,链接器只要在那个表里查找a的各个成员函数的地址即可。

可以看出,这个过程中,编译器永远不需要直接去找a.cpp,楼主不要按照你自己头脑的思维去理解电脑的操作方式。
引用楼主 pywepe 的回复:
场景:
    有一个类A,声明在A.h里,实现在A.cpp里
  自然地,在A.cpp里有一句 #include"A.h",而在A.h里没有任何关于A.cpp的描述.

    然后,一个main.cpp文件,#include"A.h",调用类A的一个方法

  想问的是 编译器怎么知道类A的实现在A.cpp里?

  又如: #include  <iostream>
    编译器又怎么找到iostream对应的cpp文件?

    iostream对应的cpp应该是已经编译好的吧,编译器不可能说把stl库全部重新编译一遍然后才能找出iostream在哪个cpp实现的吧,那编译器是怎么做的呢??



对于一些已经编译好的库的 符号表 在哪里?
[/Quote]
lib中保存有所有出现(静态)或者导出(动态库)的符号.
pywepe 2010-01-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 arong1234 的回复:]
1. 编译器从来不根据.h去找cpp文件
2. 当编译器编译一个包含了一个类A的头文件a.h的cpp的时候,它不需要知道类A的具体实现是什么,它只需要A的定义:包括a)A有那些成员变量、这些变量的类型是什么 b)A有哪些成员函数,其原型是什么。而这些在a.h中全部有,它不需要a.cpp

3. 当所有cpp文件都被编译后,a.cpp内的所有实现被放到一个叫“符号表”的地方。在链接时,所有cpp的内容都在哪儿,链接器只要在那个表里查找a的各个成员函数的地址即可。

可以看出,这个过程中,编译器永远不需要直接去找a.cpp,楼主不要按照你自己头脑的思维去理解电脑的操作方式。
引用楼主 pywepe 的回复:
场景:
    有一个类A,声明在A.h里,实现在A.cpp里
  自然地,在A.cpp里有一句 #include"A.h",而在A.h里没有任何关于A.cpp的描述.

    然后,一个main.cpp文件,#include"A.h",调用类A的一个方法

  想问的是 编译器怎么知道类A的实现在A.cpp里?

  又如: #include <iostream>
    编译器又怎么找到iostream对应的cpp文件?

    iostream对应的cpp应该是已经编译好的吧,编译器不可能说把stl库全部重新编译一遍然后才能找出iostream在哪个cpp实现的吧,那编译器是怎么做的呢??

[/Quote]

对于一些已经编译好的库的 符号表 在哪里?
Meteor_Code 2010-01-02
  • 打赏
  • 举报
回复 2
这个不是在编译一步找的,而是在连接一步
你的.H文件里只说了你使用了那些符号,比如文件A.CPP的头文件A.H:
class A
{
public:
int a;
int fun();
};
编译器看到这些知道有符号A::a,和A::fun(),当然实际的符号会更复杂.编译器把这些符号的以及引用位置记录在使用这些符号的OBJ中.也就是说一个文件A2.CPP中有对这些符号的使用,那么A2.OBJ里就有这些符号的记录
你的A.OBJ(A.CPP生成)里面则是对这些符号的具体实现或者说是解释.等连接的时候(LINK)A.OBJ,A2.OBJ,MAIN.OBJ这些文件是在一起被连接的,这时连接器对每个符号作出记录,对发现一个陌生符号会在所有你指定连接的OBJ,LIB等文件中搜索,找到以后会记录一下,并根据符号属性的不同生成不同实际的机器码,没找到就返回给你一个LINK错误:符号未解释.如果找到对同意一个有多处解释(不是引用),就返回符号重定义错误.有一点要注意:
C++中
int fun(int);和int fun();在编译的时候生成的符号并不一样,所以C++有重载的概念
但int fun(int);和long fun(int);在编译的时候生成的符号是一样的,你这样写就会产生一个错误:仅能用返回值类型分辨函数.
明白就给分哦
:-p
arong1234 2010-01-02
  • 打赏
  • 举报
回复
1. 编译器从来不根据.h去找cpp文件
2. 当编译器编译一个包含了一个类A的头文件a.h的cpp的时候,它不需要知道类A的具体实现是什么,它只需要A的定义:包括a)A有那些成员变量、这些变量的类型是什么 b)A有哪些成员函数,其原型是什么。而这些在a.h中全部有,它不需要a.cpp

3. 当所有cpp文件都被编译后,a.cpp内的所有实现被放到一个叫“符号表”的地方。在链接时,所有cpp的内容都在哪儿,链接器只要在那个表里查找a的各个成员函数的地址即可。

可以看出,这个过程中,编译器永远不需要直接去找a.cpp,楼主不要按照你自己头脑的思维去理解电脑的操作方式。
[Quote=引用楼主 pywepe 的回复:]
场景:
    有一个类A,声明在A.h里,实现在A.cpp里
  自然地,在A.cpp里有一句 #include"A.h",而在A.h里没有任何关于A.cpp的描述.

    然后,一个main.cpp文件,#include"A.h",调用类A的一个方法

  想问的是 编译器怎么知道类A的实现在A.cpp里?

  又如: #include <iostream>
    编译器又怎么找到iostream对应的cpp文件?

    iostream对应的cpp应该是已经编译好的吧,编译器不可能说把stl库全部重新编译一遍然后才能找出iostream在哪个cpp实现的吧,那编译器是怎么做的呢??
[/Quote]
cattycat 2010-01-02
  • 打赏
  • 举报
回复
找你include的文件,虽然.cpp文件没有用include,但项目中是有这个文件的,编译实际上是编译cpp文件的,根据.h头文化来确定类型信息,生成目标文件,最后链接器把这些链接成一个可执行文件。
pywepe 2010-01-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lengjiankehappy 的回复:]
#include"A.h"其中双引号中的A.h是由你自己定义的头文件,当编译的时候系统就先在你当前正在使用的文件夹中寻找,如果没有找到,就再到系统目录下的头文件中寻找,如果没有找到就会出现编译错误,
#include <iostream>其中的iostream就是系统头文件它其中包含了输入输入流的定义,如果用尖括号系统寻找头文件时就先在系统目录下寻找,然后再在当才使用的文件夹中寻找,
无论那种方式,找到头文件后系统在编译时自动将头文件在应用处展开
[/Quote]

编译器要找什么呢?
pywepe 2010-01-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dreamfgt 的回复:]
会展开的
到#include <a.h>时会吧a.h的内容展开在那里

[/Quote]

展开了又怎么了样 .h里没有实现 只有声明

实现去哪找?

lengjiankehappy 2010-01-02
  • 打赏
  • 举报
回复
#include"A.h"其中双引号中的A.h是由你自己定义的头文件,当编译的时候系统就先在你当前正在使用的文件夹中寻找,如果没有找到,就再到系统目录下的头文件中寻找,如果没有找到就会出现编译错误,
#include<iostream>其中的iostream就是系统头文件它其中包含了输入输入流的定义,如果用尖括号系统寻找头文件时就先在系统目录下寻找,然后再在当才使用的文件夹中寻找,
无论那种方式,找到头文件后系统在编译时自动将头文件在应用处展开
dreamfgt 2010-01-02
  • 打赏
  • 举报
回复
会展开的
到#include <a.h>时会吧a.h的内容展开在那里
  • 打赏
  • 举报
回复
编译器只管编译.cpp文件 不管.h文件

65,202

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧