[求助] c语言*.c *.h问题
工作需求,java转c了!!!!!! 别处看人说子程序不要定义在.h中。函数定义要放在.c中,而.h只做声明.否则多引用几次,就会发生函数重复定义的错误。 为什么? 另外c里的定义是不是指函数具体的实现,定义 声明 实现 快转晕了!!!
工作需求,java转c了!!!!!! 别处看人说子程序不要定义在.h中。函数定义要放在.c中,而.h只做声明.否则多引用几次,就会发生函数重复定义的错误。 为什么? 另外c里的定义是不是指函数具体的实现,定义 声明 实现 快转晕了!!!
答案:声明就是说明函数类型和参数类型。eg: int max(int a, int b);定义是函数的具体实现。 int max(int a,int b){ return a>b?a:b; }
其实你说的重复定义的错误不全面,可以避免,也就是说可以在h中写函数定义,但是不建议。从以下几个角度告诉你
1、从集成角度,C形成的一种公约就是h相当于你的概要设计或者API手册,java中不也有API手册的概念吗,我拿到一个API知道该API是干嘛的,需要什么参数,怎么得到结果OK了,至于怎么实现的,不需要知道。交给程序就行了。
2、从编译的角度来说,h只是一种预处理,C的编译都是以.c文件(目标文件)为主进行编译的,如果你在h里面写了函数声明,如果没有进行处理或内联,那么几个C文件引用h就相当于在几个C文件里面拷贝了该函数,就会出现你说的错误。你可以简单的把#include<xx.h>理解为把xx.h中的代码一字不漏的复制过来。所以你h中有定义就会出现你说的错误(没做处理的情况下)。
3、从程序的逻辑性考虑。假如你h中实现的话,假设用到全局变量,那么也就意味着你的全局变量在h中声明,那么所有的引用(#iinclude)都会包含一份同名的全局变量,而你的初衷是只有一个。但没办法,程序运行也是以目标文件(.c)为基础。
4、从程序的易用性来考虑。
你做C编程会发现一个问题,也就是说C是模块化的东西。这也是.h的初衷,把公共API提供出来,而不用管具体实现,在API声明不变的情况下,多个模块可以同步的独立开发。
说实际一点就是,比如你写了10个文件(一个配套的t.h和t.c,以及其他8个.c),假如所有.c都引用了该t.h文件,因为你的函数定义是放在t.c中,那么当你需要修改一个函数的实现的时候,你会发现编译器只需要重新编译t.c就完事了。但是,如果你的函数定义在t.h,那么你会发现所有引用t.h的C文件都要重新编译一遍。
所以,当你把模块化再放大,想想你们一个小组作业的时候,你非要把函数定义在.h中,其他三个程序要用你的程序,一旦你需要修改函数定义,其他三个人的程序都需要重新编译(C语言的动态库.dll就是这个意思,也是只提供了相当于.h的API说明,即使你修改,只要不修改函数的声明,那么对于其他模块不影响)。