当前位置:编程学习 > C/C++ >>

C语言、C++:关于多文件编程

关于C、C++的多文件编程,额有很多不解(或者说完全不会),希望能得到热心网友指点,回答几个问题都行,有能全答的再追加50分
1、头文件只能添加.h的文件吗?.c行不行?
2、为什么只在.h中添加声明、宏,而不编写实现?这是必须的,还是约定?
3、编译器是怎么找到函数的实现在哪的?在主文件中我们只用#include添加头文件,而头文件中只有函数的声明、却没有实现,那么编译器要怎么知道函数的具体定义(即实现)呢?

总而言之,就是想知道“怎么进行多文件编程”,若能提供相关资料来帮我解决上述问题也可。
补充:大家的回答很详细,十分感谢,50分已追加。但关于第三个问题,我仍然不明白,编译器是怎么找到含有实现的.cpp文件呢?编译器不可能把整个计算机里的文件都遍历一遍吧?
我用DEV-CPP做了几个测试,发现并不是仅仅将.h对应的.cpp链接,貌似是把一定范围内的.cpp都链接上。测试如下(共三个文件,代码稍长,但内容很简单,请耐心读完):
//main.cpp
#include<stdlib.h>
#include"print.h"

int main()
{
    print();
    system("PAUSE");
   
    return 0;
}
//comply.cpp
#include<iostream.h>

void print()
{
     cout<<"Printed!"<<endl;
}
//print.h
void print();
追问:如果说第一个不行,为什么下面个工程编译通过了:
///~:print.c
#include<iostream.h>
#include<stdlib.h>

///~:main.c
#include"print.c"

int main()
{
    cout<<"Hello World!"<<endl;
    system("pause");
   
    return 0;
}
答案:1,一般都是用.h后缀表示这是头文件,你也可以改为 .a  .b   .c  .123什么的,只要文件内容是符合C或C++的语法的就行。


2,对于某些库,人家已经先编译好代码,那些函数的实现也已经编译好了,你直接#include这个库提供的头文件,按照头文件中的函数声明来用函数就可以了,进行链接时,编译器自动把这个库的代码和你的程序链接。
以C语言为例,比如stdio.h,string.h等头文件,都是C语言的标准库里的,你编译程序,编译器默认会将标准库和你的程序链接。如果不这样,按照你所说的,要有函数的实现,那你每次编译,编译器都要重新编译一次C标准库的源代码,这不是浪费时间吗?标准库的源代码可不是几百行这么点,至少上十万行,重新编译一次,起码要等近半个小时,甚至更多,为了解决这问题,就有了动态库和静态库,具体百度或谷歌搜索相关信息,或者看书。


3,参考2中所说的,编译器把函数库的源代码编译成目标文件,这个目标文件内有相关函数的接口定义,你的程序用到了这个库中某个函数,编译器会在链接时将之与库中的接口链接。
一般的书开头几页都会说,程序编译的过程是:源代码-》编译-》链接-》可执行文件,貌似是这样的;


编译只是审查源代码是否有语法错误,头文件的函数声明只是告诉编译器,需要留一个接口,给那个未找到实现的函数,等到链接时再接上;链接时,就是将各个目标文件中的接口部全,拼起来,最后就拼出一个可执行文件,,就和拼图一样,这些已编译的目标文件就像零散的图块,进行链接也就是将这些图块拼成一副完整的图(可执行文件)。如果这些目标文件内没有你正使用的函数的实现,那么就会报错,链接失败。


想进行多文件编程,先去了解动态库和静态库,以及编译原理,相关知识百度或谷歌能搜索到,毕竟这些大多数学编程的人都会掌握到。
如果你的程序只有几十行或几百行,多文件就起不了多大作用,如果是1000+行,那就得考虑用多文件来分割代码了。头文件的作用就是不必在每次调用其它.c文件内的函数或使用自定义数据类型时,在.c文件内写上它们的声明,以及数据的定义,直接#include即可,如果要改函数名或参数,以及数据定义,那么直接修改头文件即可,不必在每个用到这些函数和数据类型的.c文件内重新写上声明和数据定义。一两个倒是不觉得麻烦,几十个或者上百个就能感到很麻烦了,浪费时间,编程效率低下,而且可能会由于某个.c文件内未及时更新函数声明以及数据定义而导致程序出现不可预料的问题。



你如果是用编译器自动生成的文件,编译器自动加到项目里,自己写的,你要手动在项目中添加文件,编译器才会检索,编译器只检索属于项目的文件
1,.c或者.cpp不需要包含,如果你是用VS系列,.h和.cpp是一对的,你包含了X.h就是能使用X.cpp的资源、你自己想包含的话那也无所谓,一般是编译器做的
2 .h可以添加实现,一切都可以添加。但是为了代码的隐藏和符合编程的机制,一般都放到对应的.cpp。简短的函数可以直接放在.h,你自己找起来也方便
3.包含了.h就能直接使用对应的.C。项目中这种事情一般让编译器去实现。其实编译的时候,编译器会自动检索所有文件,只要你有声明,实现不管你写在哪,编译器都会找到的,写在对应的.h和.cpp是为了方便和规范的需要第一  不行
第二  为了方便 因为每次都要在源文件中加入这样会不方便的,如果,在.h文件声明 那么 直接包含头文件就可以啦! 这个不是必须的 但是符合软件工程思想  这个是标准吧!
第三  这个是函数声明的作用  声明为了证明有这个函数 至于这个函数在别的地方啊!
1.头文件的文件名是.h 就如你写C程序改名为.java行不行?
2.h中的声明等都是有代码,只是你看不到,你只是调用他而已
3.头文件包含在你编译器的lib文件夹里, 具体的代码你是看不到的···他是被封装好的··· 

上一个:JAVA与C语言区别在哪
下一个:谁能提供C语言详细内容

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,