一个关于VC头文件的问题.
一个关于VC头文件的问题.
我写了一个头文件: myhead.h
然后我实现了头文件中定义的函数: myhead.cpp
为什么在VC下,我在主程序中要#include "myhead.h " 而不是 #include "myhead.cpp "
我的言下之意是:VC怎么找到myhead.h对应的实现myhead.cpp
如果答案是同一文件名的话,那如果我不是用myhead.cpp来实现的,而是 myhead_impl.cpp来实现,VC岂不找不到了?
[解决办法]
编译
你要明白,.h是不参与编译的.
编译器会将cpp文件中包含的.h文件复制到.cpp文件里面,然后编译.cpp 也就是说编译的时候每个cpp文件都是独立的
编译器为cpp文件中的函数变量名,做了一个符号表,这个符号表就存在obj文件里面.
链接
连接器将所编译的obj文件读取到内存中,这个时候符号和对应的函数进行合并.如果有两个obj文件中存在相同的变量符号,那么就会链接错误,变量重复定义.
[解决办法]
首先,这个 h 和 cpp 都是在同一个工程中的,
否则没有 cpp 只有 h 文件会提示找不到定义。
由于在同一个工程中,
那么,显然,
在工程管理中会有一些信息知道工程相关的信息,
这个可以理解吧?
有附加信息,那么找到定义不也是很好理解的么?
[解决办法]
似乎不领情哦:)
akirya(坏[其实偶不是什么所谓的坏人]) 已经说过了
函数在obj文件内,就是符号变量,当然,如果你试过__stdcall等就知道如何限制编译器为函数名定义一个何类型的符号变量了。
别说一个全局函数或域函数,就算成员函数也是这样。
不过似乎你想讨论的就是---
1.cpp内调用fun(),那么它生成1.obj
2.cpp实现fun(),那么它生成2.obj
为什么编译器能准确识别到fun的实现部分,而不管它在2.cpp也好10000.cpp也好,对吧?
编译器只在最后的链接步骤里才将全部的obj组合起来的,当然这里面细节也很多。
能理解吗?所有obj最后都合并了,也就是说,所有的函数定义和调用都在一起了,大家一眼就能望见彼此,当然找的到了…………
你在myhead.h中声明一个函数,但从不调用它,也不去实现它,你看看出错不。
反过来,你声明了也调用了,但没有实现,仔细看编译的错误提示,
正在编译
XX.cpp
正在编译
XXX.cpp
正在链接
…………那错误是什么?
因为编译器在最后的未定位机器语言文件中找不到该符号变量了。因为任何一个obj里面都没这个符号变量。
sorry,罗嗦了这么多。关于头文件,仔细看看前几位的回复吧。别露掉任何一个字。尤其是楼上2位的。 <myhead.h> 你完全可以不#include 的,自己把声明写进去也行----如果你愿意这么做。
你看过编译原理?但愿你不是只看过第一章。
唉,怪我气胜,见笑:)