.h文件里面不用全部车身覆盖件的组成6名称一样的.c里面的函数吗

如何在c语言中定义函数在.h文件,和在新文件中使用_百度知道
如何在c语言中定义函数在.h文件,和在新文件中使用
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
1、打开或者新建.h文件;2、在该文件中添加你的函数;3、保存退出,记住该文件名及其路径;4、在新文件中包含该文件名,如果该文件不在搜索路径下,则包含该文件的全名比如:定义一个函数void mydefun(){}调试无误后,以文件名aa.h保存在D:\abc目录下在新文件中要用到这个函数,则包含语句中必须有以下一条语句:#include&D:\\abc\\aa.h&然后你就可以调用mydefun()函数了。
采纳率:52%
建立一个a.h文件,在其中声明函数void enter_string(char str[80]);在b.c中包括 a.h文件。#include &a.h&当然,这样的前提条件是a.h,a.c,b.c这三个文件放在同一个目录下(各个编译器可能不太一样)也可以把a.c做成lib文件,也是一样的
额,书上都有吧。 一般来说,头文件(.h)都包含了一些常用的而且已经通过了测试证明其运行正确的函数,在自己的程序中用#include引用这些头文件,直接使用其中一些已经写好的函数,就省去了很多麻烦,提高了代码的重用性。例如我们常常在程序中写下 #include &stdio.h& 语句,以使用头文件 stdio.h 中的函数,比如说printf函数。可是该如何写自己的头文件,以让自己的函数能被再次使用呢? 也许有同学会想,真接把自己的函数声明与定义移到.h文件里就可以了。就如下面的做法: 在工程里建好main.c后,再建一个点utils.h文件,把常用的函数如mean()放这里。 // file name : utils.h// version : 1 doublemean(double, double);
//求两个数的均值 doublemean(double a, double b){
return (a+b)/2.0;} // file name : main.c// version : 1 #include&stdio.h&#include&utils.h& intmain(){
double a,b,
avg = mean(a,b);
//调用utils.h里的mean函数
printf(&%lf\n&, avg);
return0;} 以上的代码是可以编译通过的,并运行正确的。但是,这样的代码并不完善。如果再写一个头文件other.h,而other.h又引用了utils.h的mean()函数,这时就会出问题: // file name : utils.h// version : 1 doublemean(double, double);
//求两个数的均值 doublemean(double a, double b){
return (a+b)/2.0;} // file name : other.h// version : 1 #include&utils.h&
//引用 utils.h doublemean4(double, double, double, double); doublemean4(double a, double b, double c, double d){
returnmean(mean(a,b), mean(c,d));
// 调用了 utils.h 里的 mean 函数} // file name : main.c// version : 2// 增加了对other.h的引用 #include&stdio.h&#include&utils.h&#include&other.h& intmain(){
double a,b,c,d,
avg = mean(a,b);
//调用utils.h里的mean函数
printf(&%lf\n&, avg);
avg = mean4(a,b,c,d);
//调用other.h里的mean4函数
printf(&%lf\n&, avg);
return0;} 而此时,编译就不能通过了,并出现如下的错误信息:utils.h:9: Error: 'mean'is already defined究其原因就是,函数的声明可以在程序中写多次,但函数定义只能有一个。main.c引用了utils.h文件,因此main.c里会有一个mean()函数的声明,而other.h里也引用了utils.h文件,所以又有一个mean()函数的声明。 main.c &-- utils.h
第一个mean()
&-- other.h &-- utils.h
第二个mean() 历史原因,C/C++编译器不能将这样相同的重复声明区别开,所以必须通过其它的方法使得工程里,mean()只被声明一次。一般来说,都是通过#ifndef/#define/#endif宏命令组合来实现避免重复声明的。修改后的代码如下://file name : utils.h//version 2 #ifndef UTILS_H_INCLUDED
// 如果没有定义标识符
// UTILS_H_INCLUDED,则
// 继续编译下面的代码,
// 直到 #endif
#define UTILS_H_INCLUDED
// 定义标识符 UTILS_H_INCLUDED doublemean(double, double);
doublemean(double a, double b){
return (a+b)/2.0;} #endif// UTILS_H_INCLUDED其它代码都同前。#ifndef/#endif 就像 if(!(...)) {} 一样,让编译器明白,如果没有定义标识符UTILS_H_INCLUDED,就包含下面的代码,直到#endif;否则,到#endif为止的代码就不被包含到文件里。#define表示定义一个标识符(不一定要赋值给这个标识符)。 当main.c引用utils.h时,由于UTILS_H_INCLUDED没被定义,所以#ifndef与#endif之间的代码都会被main.c包含,所以 #define 语句会被执行,定义一个UTILS_H_INCLUDED标识符,同时工程里也有了一个mean()函数的定义;当main.c引用other.h时,other.h里对utils.h的引用并不会再次定义mean(),因为UTILS_H_INCLUDED已经被定义了,通过#ifndef/#endif的控制作用,虽然other.h引用了utils.h,但引用的头文件并没有包含mean()的声明,自然就不会再引起重复定义的错误,编译就能通过了。 基于相同的道理,所有的.h文件,都应该加入#ifndef/#define/#endif的组合,以使头文件都能重复利用而不引起重复定义的错误。例子中的other.h文件也应如此,这里就留给同学自己添加了。参考网址:
为您推荐:
其他类似问题
c语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。C语言中 .h文件和.c文件的区别 (转)
要理解.c文件与.h文件有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:1.预处理阶段2.词法与语法分析阶段3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息
编译器在编译时是以c文件为单位进行的,也就是说如果你的项目中一个c文件都没有,那么你的项目将无法编译,连接器是以目标文件为单位,它将一个或多个目
标文件进行函数与变量的重定位,生成最终的可执行文件,在PC上的程序开发,一般都有一个main函数,这是各个编译器的约定,当然,你如果自己写连接器
脚本的话,可以不用main函数作为程序入口!!!!有了这些基础知识,再言归正传,为了生成一个最终的可执行文件,就需要一些目标文件,也就是需要C文件,而这些C文件中又需要一个main函数作为可执行程序的入口,那么我们就从一个C文件入手,假定这个C文件内容如下:#include &stdio.h&#include "mytest.h"int main(int argc,char **argv){ test = 25; printf("test.................%d\n",test);}mytest.h文件内容如下:现在以这个例子来讲解编译器的工作:1.预处理阶段:编译器以C文件作为一个单元,首先读这个C文件,发现第一句与第二句是包含.h文件,就会在所有搜索路径中寻找这两个文件,找到之后,就
会将相应.h文件中再去处理宏,变量,函数声明,嵌套的.h文件包含等,检测依赖关系,进行宏替换,看是否有重复定义与声明的情况发生,最后将那些文件中
所有的东东全部扫描进这个当前的C文件中,形成一个中间“C文件”2.编译阶段,在上一步中相当于将那个.h文件中的test变量扫描进了一个中间C文件,那么test变量就变成了这个文件中的一个全局变量,此时,就将
所有这个中间C文件的所有变量,函数分配空间,将各个函数编译成二进制码,按照特定目标文件格式生成目标文件,在这种格式的目标文件中进行各个全局变量,
函数的符号描述,将这些二进制码按照一定的标准组织成一个目标文件3.连接阶段,将上一步成生的各个目标文件,根据一些参数,连接生成最终的可执行文件,主要的工作就是重定位各个目标文件的函数,变量等,相当于将个目标文件中的二进制码按一定的规范合到一个文件中 再回到c文件与h文件各写什么内容的话题上:理论上来说C文件与h文件里的内容,只要是C语言所支持的,无论写什么都可以的,比如你在h文件中写函数体,只要在任何一个C文件包含此.h文件就可以将
这个函数编译成目标文件的一部分(编译是以C文件为单位的,如果不在任何C文件中包含此.h文件的话,这段代码就形同虚设),你可以在C文件中进行函数声
明,变量声明,结构体声明,这也不成问题!!!那为何一定要分成h文件与C文件呢?又为何一般都在h文件中进行函数,变量声明,宏声明,结构体声明呢?而
在C文件中去进行变量定义,函数实现呢??原因如下:1.如果在h文件中实现一个函数体,那么如果在多个C文件中引用它,而且又同时编译多个C文件,将其生成的目标文件连接成一个可执行文件,在每个引用此h
文件的C文件所生成的目标文件中,都有一份这个函数的代码,如果这段函数又没有定义成局部函数,那么在连接时,就会发现多个相同的函数,就会报错2.如果在h文件中定义全局变量,并且将此全局变量赋初值,那么在多个引用此h文件的C文件中同样存在相同变量名的拷贝,关键是此变量被赋了初值,所以编
译器就会将此变量放入DATA段,最终在连接阶段,会在DATA段中存在多个相同的变量,它无法将这些变量统一成一个变量,也就是仅为此变量分配一个空
间,而不是多份空间,假定这个变量在h文件没有赋初值,编译器就会将之放入BSS段,连接器会对BSS段的多个同名变量仅分配一个存储空间3.如果在C文件中声明宏,结构体,函数等,那么我要在另一个C文件中引用相应的宏,结构体,就必须再做一次重复的工作,如果我改了一个C文件中的一个声
明,那么又忘了改其它C文件中的声明,这不就出了大问题了,程序的逻辑就变成了你不可想象的了,如果把这些公共的东东放在一个头文件中,想用它的C文件就
只需要引用一个就OK了!!!这样岂不方便,要改某个声明的时候,只需要动一下h文件就行了4.在h文件中声明结构体,函数等,当你需要将你的代码封装成一个库,让别人来用你的代码,你又不想公布源码,那么人家如何利用你的库呢?也就是如何利用
你的库中的各个函数呢??一种方法是公布源码,别人想怎么用就怎么用,另一种是提供头文件,别人从头文件中看你的函数原型,这样人家才知道如何调用你写的
函数,就如同你调用printf函数一样,里面的参数是怎样的??你是怎么知道的??还不是看人家的头文件中的相关声明啊!!!当然这些东东都成了C标
准,就算不看人家的头文件,你一样可以知道怎么使用例子://a.hvoid foo(); //a.c#include "a.h"
//我的问题出来了:这句话是要,还是不要?void foo(){}//main.c#include "a.h"int main(int argc, char *argv[]){
  return 0;}
针对上面的代码,请回答三个问题:1.a.c 中的#include "a.h" 这句话是不是多余的?为什么经常见xx.c 里面include 对应的xx.h?2.如果a.c 中不写,那么编译器是不是会自动把.h 文件里面的东西跟同名的.c 文件绑定在一起?3.第三个问题我给他改了一下:如果a.c 中不写include&&,那么编译器是不是会自动把.h 文件里面的东西跟同名的.c文件绑定在一起?下面是一位牛人的原话:
从C编译器角度看,.h和.c皆是浮云,就是改名为.txt、.doc也没有大的分别。换句话说,就是.h和.c没啥必然联系。.h中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。这个声明有啥用?只是让需要用这些声明的地方方便引用。因为#include "xx.h" 这个宏其实际意思就是把当前这一行删掉,把xx.h 中的内容原封不动的插入在当前行的位置。由于想写这些函数声明的地方非常多(每一个调用xx.c 中函数的地方,都要在使用前声明一下子),所以用#include "xx.h" 这个宏就简化了许多行代码——让预处理器自己替换好了。也就是说,xx.h 其实只是让需要写xx.c 中函数声明的地方调用(可以少写几行字),至于include 这个.h 文件是谁,是.h 还是.c,还是与这个.h 同名的.c,都没有任何必然关系。
这样你可能会说:啊?那我平时只想调用xx.c 中的某个函数,却include了xx.h 文件,岂不是宏替换后出现了很多无用的声明?没错,确实引入了很多垃圾 ,但是它却省了你不少笔墨,并且整个版面也看起来清爽的多。鱼与熊掌不可得兼,就是这个道理。反正多些声明(.h一般只用来放声明,而放不定义,参见拙著“过马路,左右看”)也无害处,又不会影响编译,何乐而不为呢?翻回头再看上面的3个问题,很好解答了吧?它的解答如下:1.不一定。这个例子中显然是多余的。但是如果.c中的函数也需要调用同个.c中的其它函数,那么这个.c往往会include同名的.h,这样就不需要为声明和调用顺序而发愁了(C语言要求使用之前必须声明,而include同名.h一般会放在.c的开头)。有很多工程甚至把这种写法约定为代码规范,以规范出清晰的代码来。2.答:1中已经回答过了。3.答:不会。问这个问题的人绝对是概念不清,要不就是想混水摸鱼。非常讨厌的是中国的很多考试出的都是这种烂题,生怕别人有个清楚的概念了,绝对要把考生搞晕。 补充一下:
一个程序仅有一个H文件,没有C文件,可以吗?
答案是肯定的,不可以!在VC6.0下可以看到编译按钮的颜色!变灰,表示无法编译。
&script&window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=.js?cdnversion='+~(-new Date()/36e5)];&/script&
阅读(37) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
C语言中.h文件和.c文件详细解析 此博文包含图片
.c和.h文件的区别(头文件与之实现文件的的关系~ )
c语言中.h文件的作用
c语言自己写一个.h的头文件
C语言中的.h文件的作用
C/C++ 语言中.h文件和.c文件详细解析
引用 .c和.h文件的区别
.c和.h文件的区别
jni.h头文件详解(一)
没有更多推荐了,C++中类定义可以写在.h文件,但函数定义却不行
前两个转自:
一、定义和声明
1) 定义就是声明,声明不一定就是定义,声明的意思是已经定义了。
定义是直接说已经定义了,非定义声明,是间接说已经定义了。
声明,不需要明白告诉你,定义成什么样子,你懂得就行。
定义,必须清晰,不能含糊,因为要分配空间。
2) C类型定义,等同于声明。因为没有定义数据,和代码。
3) C++类内定义的成员函数,友元函数,静态函数,可以看作inline 定义,地位相当于声明。
C++类内定义的成员变量,只是一种声明,不是真正的定义,只有用这个类定义对象,成员变量才真正有定义。
C++静态变量,通常要在类外定义,除非是静态整型常量,用常量表达式定义,才可以定义在类内部 。
C++ 类定义,实际上也是类型定义,等同于声明。
只是,类内部可以定义函数,与C类型定义有所不同。
4)常量定义可以看做声明。
5)C++ 把文件静态变量的定义看作声明,可以放到头文件里。
6)C++ 模板,实际上也可以看做声明。
因为模板在使用的时候才会实例化,生成一个可以使用的类型或者函数。
所以,头文件里面,要么是声明。
要么是可以看做声明的定义。
这些东西,都不会造成命名冲突,于是放在头文件里。
二、请参考《C++ Primer中文版》第四版 人民邮电出版社 P58:
因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。
对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时就已经知道的const对象和inline函数。这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。
在头文件中定义这些实体,是因为编译器需要它们的定义(不只是声明)来产生代码。
三、关于template&&只能定义在.h文件中:
在我写我的算法库AgAlgo的第一个算法(selection sort)时,就踩中了C++的一个坑,苦思苦搜两天不得其解,直到得到的点拨才明白什么情况,果然相互学习是比较有效的学习方式。
这个问题是关于模版类的成员函数的定义方法的问题,具体可见github上代码的。我按照普通类的写法,在.h中声明类的成员函数,在.cpp中写该函数的定义,然后在main.cpp中只include这个.h文件,编译时把main.cpp和selection_sort.cpp放在同一个编译单元里面。按理这样就能生成可执行文件了,但是链接时却报错说找不到函数的定义:
原因是模版类在编译时是在使用的地方才实例化,但不同的.cpp文件是在link时才相互关联,因此编译main.cpp时只实例化了函数的声明,并且认为在某个地方已经实例化了函数的定义,悲剧的是编译selection_sort.cpp时并没有给main.cpp中的这个用法做实例化,于是linker就找不到main.cpp所需要的函数定义了。
于是只有两种解决办法,或者在selection_sort.cpp中给需要的实例化显示地做定义(这样做扩展性就很差),或者把template函数的定义也放在.h文件中。
于是我和讨论为什么C++没办法直接在编译时跨文件实例化template,结论是源于C的单文件编译单元的效率考虑,使得编译时(链接之前)是没办法知道其他编译单元到底需要什么实例。如果linker能给compiler反馈机制,使得linker之后还能再编译一遍给做必要的实例化,应该能提供这个特性(填上这个反直觉的坑)了,或者在编译之前专门做一遍预编译,给每个使用的template跨文件标记出需要的实例化,从而编译时就能解决这个问题了。
以上转自:
四:《C++标准程序库》P10
template并非一次编译便生出适合所有性别的代码,而是针对被使用的某个(或某组)性别进行编译。这导致一个重要的问题:实际处理template时,面对template fuction,你必须先提供它的某个实作品,然后才能调用,如此方可通过编译。所以目前唯一能够让template的运用具有可移植性的方式,就是在头文件中以inline function实现template function。
C++ 类的成员函数定义在.h中为什么会产生函数重定义错误?
C++ 在.h文件中包含头文件和在.cpp文件中包含头文件有什么区别?
C++如何在.h头文件中直接定义函数
C++中的::的作用
C++ 在.h文件中声明,在.cpp文件中定义 模板函数和模板类
Linux应用开发———已经添加了C函数对应的头文件,还是提示找不到那个函数
c++ 头文件中定义函数的优缺点
C++ 将类的声明和定义部分保存在头文件中
C++中两个类的头文件互相包含问题
c++中为什么函数定义可以在主函数后面而类的定义不可以?
没有更多推荐了,函数定义在.h和.c中,有什么差别?_百度知道
函数定义在.h和.c中,有什么差别?
我在使用单片机的时候,以前都是把函数定义在.c中,在。h中声明。。但发现函数其实也是可以在.h中定义的。。而且这样也不用在extern来声明一遍了。请问下这两个有什么差别。。为什么大家都说把函数定义在.c中,在。h中声明。。
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
在.h中声明函数,方便其他文件包含此声明。在.c中定义函数,而不在.h中定义函数,是为了避免多次包含时,产生重复定义。
采纳率:70%
这是因为一般来说头文件可以被多个c文件include,如果函数在.h里面定义(不是声明),被多次包含后,就会造成重复定义的问题。当然,在一些小工程里面,如果一个头文件只会被include一次,也未尝不可。但一般不提倡这样做。
本回答被网友采纳
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。自己的C语言文件,如何像系统.h文件一样调用
[问题点数:40分]
本版专家分:55
结帖率 82.5%
CSDN今日推荐
本版专家分:347
本版专家分:5276
本版专家分:55
本版专家分:10525
本版专家分:2950
本版专家分:55
本版专家分:666
本版专家分:22677
匿名用户不能发表回复!|
其他相关推荐

我要回帖

更多关于 es文件管理6 的文章

 

随机推荐