c语言在头文件中调用函数
可以调用。
一、从一个源文件里调用另一个源文件的函数。在源文件A1.c中调用A2.c 中的函数有两种方法:
1、在A2.c中有完整的函数定义,在A1.c中添加一下要用到的函数原型(声明)就可以了,例如:
在A2.c中:有函数void A2(){...};。
在A1.c中:在文件前头增加一行:void A2();就可以了。
2、把A2.c中完整定义的函数的原型,写到一个A2.h文件中,然后在A1.c的文件头增加#include "A2.h"就可以了。
以上两种方法,在A1.c中都可以正常的调用,就跟在A2.c中调用一样。
其实函数默认是外部的,只要在其他文件中声明就能使用;但是注意如果在前面加上static,就只能在本文件中使用了,不能再被其他的文件调用。
二、编写头文件:
1、一个.h文件要 对应有一个.c文件,这样链接器就可以调用这个文件里的函数。比如a.h 和 a.c。
在.h文件中:
#ifndef __A_H_
#define __A_H_
#include
void trans2(double B) ;
double trans1() ;
#endif
2、把相应的函数定义写在.c文件中。这里要强调一点:要加上#include ".h",这个一般作为一种工程规范。因为如果.c文件中的函数也需要调用同个.c中的其它函数,那么这个.
c往往会include对应的.h,这样就不需要为声明和调用顺序而发愁了。比如头文件里进行了变量的声明,这个时候对应的.c文件是一定要加上这个头文件的。
3、再在其他的main.c文件开头添加#include "a.h"。
扩展资料:include用法:
#include命令预处理命令的一种,预处理命令可以将别的源代码内容插入到所指定的位置;可以标识出只有在特定条件下才会被编译的某一段程序代码;可以定义类似标识符功能的宏,在编译时,预处理器会用别的文本取代该宏。
插入头文件的内容
#include命令告诉预处理器将指定头文件的内容插入到预处理器命令的相应位置。有两种方式可以指定插入头文件:
1、#include
2、#include"文件名"
如果需要包含标准库头文件或者实现版本所提供的头文件,应该使用第一种格式。如下例所示:
#include//一些数学函数的原型,以及相关的类型和宏
如果需要包含针对程序所开发的源文件,则应该使用第二种格式。
采用#include命令所插入的文件,通常文件扩展名是.h,文件包括函数原型、宏定义和类型定义。只要使用#include命令,这些定义就可被任何源文件使用。
file1.c 头文件为file1.h
file2.c 头文件为file2.h
比如file2.c要调用file1.c里的一个函数
首先file2.c里要包含file1.h头文件(file1.h里有file1.c的函数申明)
然后file2.c文件里要有file1.c里的外部函数申明,用extern关键字申明
然后就可以直接file2.c里面调用file1.c里的函数了
我在单片机里是这样弄的完全没问题,51,avr,pic都可以
main()
{
printf(“Hello world!”);
}
例程-1
看看上面的程序,没有.h文件。是的,就是没有,世界上的万物都是经历从没有到有的过程的,我们对.h的认识,我想也需要从这个步骤开始。这时确实不需要.h文件,因为这个程序太简单了,根本就不需要。那么如何才能需要呢?让我们把这个程序变得稍微复杂些,请看下面这个,
文件名 First.c
printStr()
{
printf(“Hello world!”);
}
main()
{
printStr()
}
例程-2
还是没有, 那就让我们把这个程序再稍微改动一下.
文件名 First.c
main()
{
printStr()
}
printStr()
{
printf(“Hello world!”);
}
例程-3
等等,不就是改变了个顺序嘛, 但结果确是十分不同的. 让我们编译一下例程-2
和例程-3,你会发现例程-3是编译不过的.这时需要我们来认识一下另一个C语言中的概念:作用域.
我们在这里只讲述与.h文件相关的顶层作用域, 顶层作用域就是从声明点延伸到源程序文本结束, 就printStr()这个函数来说,他没有单独的声明,只有定义,那么就从他定义的行开始,到first.c文件结束, 也就是说,在在例程-2的main()函数的引用点上,已经是他的作用域. 例程-3的main()函数的引用点上,还不是他的作用域,所以会编译出错. 这种情况怎么办呢? 有两种方法 ,一个就是让我们回到例程-2, 顺序对我们来说没什么, 谁先谁后不一样呢,只要能编译通过,程序能运行, 就让main()文件总是放到最后吧. 那就让我们来看另一个例程,让我们看看这个方法是不是在任何时候都会起作用.
文件名 First.c
play2()
{
play1()
}
play1()
{
play2()
);
}
main()
{
play1()
}
例程-4
也许大部分都会看出来了,这就是经常用到的一种算法, 函数嵌套, 那么让我们看看, play1和play2这两个函数哪个放到前面呢?
这时就需要我们来使用第二种方法,使用声明.
文件名 First.c
play1();
play2();
play2()
{
play1()
}
play1()
{
play2()
);
}
main()
{
play1()
}
例程-4
经历了我的半天的唠叨, 加上四个例程的说明,我们终于开始了用量变引起的质变, 这篇文章的主题.h文件快要出现了。
一个大型的软件项目,可能有几千个,上万个play, 而不只是play1,play2这么简单, 这样就可能有N个类似 play1(); play2(); 这样的声明, 这个时候就需要我们想办法把这样的play1(); play2(); 也另行管理, 而不是把他放在.c文件中, 于是.h文件出现了.
文件名 First.h
play1();
play2();
文件名 First.C
#include “first.h”
play2()
{
play1()
}
play1()
{
play2()
);
}
main()
{
play1()
}
例程-4
各位有可能会说,这位janders大虾也太罗嗦了,上面这些我也知道, 你还讲了这么半天, 请原谅,如果说上面的内容80%的人都知道的话,那么我保证,下面的内容,80%的人都不完全知道. 而且这也是我讲述一件事的一贯作风,我总是想把一个东西说明白,让那些刚刚接触C的人也一样明白.
上面是.h文件的最基本的功能, 那么.h文件还有什么别的功能呢? 让我来描述一下我手头的一个项目吧.
这个项目已经做了有10年以上了,具体多少年我们部门的人谁都说不太准确,况且时间并不是最主要的,不再详查了。 是一个通讯设备的前台软件, 源文件大小共 51.6M, 大小共1601个文件, 编译后大约10M, 其庞大可想而知, 在这里充斥着错综复杂的调用关系,如在second.c中还有一个函数需要调用first.c文件中的play1函数, 如何实现呢?
Sencond.h 文件
play1();
sencond.c文件
***()
{
…………….
Play();
……………….
}
例程-5
在sencond.h文件内声明play1函数,怎么能调用到first.c文件中的哪个play1函数中呢? 是不是搞错了,没有搞错, 这里涉及到c语言的另一个特性:存储类说明符.
C语言的存储类说明符有以下几个, 我来列表说明一下
说明符 用法
Auto 只在块内变量声明中被允许, 表示变量具有本地生存期.
Extern 出现在顶层或块的外部变量函数与变量声明中,表示声明的对象
具有静态生存期, 连接程序知道其名字.
Static 可以放在函数与变量声明中. 在函数定义时, 其只用于指定函数
名,而不将函数导出到连接程序. 在函数声明中,表示其后面会有
定义声明的函数, 存储类为static. 在数据声明中, 总是表示定义
的声明不导出到连接程序.
无疑, 在例程-5中的second.h和first.h中,需要我们用extern标志符来修饰play1函数的声明,这样,play1()函数就可以被导出到连接程序, 也就是实现了无论在first.c文件中调用,还是在second.c文件中调用,连接程序都会很聪明的按照我们的意愿,把他连接到first.c文件中的play1函数的定义上去, 而不必我们在second.c文件中也要再写一个一样的play1函数.
但随之有一个小问题, 在例程-5中,我们并没有用extern标志符来修饰play1啊, 这里涉及到另一个问题, C语言中有默认的存储类标志符. C99中规定, 所有顶层的默认存储类标志符都是extern . 原来如此啊, 哈哈. 回想一下例程-4, 也是好险, 我们在无知的情况下, 竟然也误打误撞,用到了extern修饰符, 否则在first.h中声明的play1函数如果不被连接程序导出,那么我们在在play2()中调用他时, 是找不到其实际定义位置的 .
那么我们如何来区分哪个头文件中的声明在其对应的.c文件中有定义,而哪个又没有呢? 这也许不是必须的,因为无论在哪个文件中定义,聪明的连接程序都会义无返顾的帮我们找到,并导出到连接程序, 但我觉得他确实必要的. 因为我们需要知道这个函数的具体内容是什么,有什么功能, 有了新需求后我也许要修改他, 我需要在短时间内能找到这个函数的定义, 那么我来介绍一下在C语言中一个人为的规范:
在.h文件中声明的函数,如果在其对应的.c文件中有定义,那么我们在声明这个函数时,不使用extern修饰符, 如果反之,则必须显示使用extern修饰符.
这样,在C语言的.h文件中,我们会看到两种类型的函数声明. 带extern的,还不带extern的, 简单明了,一个是引用外部函数,一个是自己生命并定义的函数.
最终如下:
Sencond.h 文件
Extern play1();
上面洋洋洒洒写了那么多都是针对函数的,而实际上.h文件却不是为函数所御用的. 打开我们项目的一个.h文件我们发现除了函数外,还有其他的东西, 那就是全局变量.
在大型项目中,对全局变量的使用不可避免, 比如,在first.c中需要使用一个全局变量G_test, 那么我们可以在first.h中,定义 TPYE G_test. 与对函数的使用类似, 在second.c中我们的开发人员发现他也需要使用这个全局变量, 而且要与first.c中一样的那个, 如何处理? 对,我们可以仿照函数中的处理方法,在second.h中再次声明TPYE G_test, 根据extern的用法,以及c语言中默认的存储类型, 在两个头文件中声明的TPYE G_test,其实其存储类型都是extern, 也就是说不必我们操心, 连接程序会帮助我们处理一切. 但我们又如何区分全局变量哪个是定义声明,哪个是引用声明呢?这个比函数要复杂一些, 一般在C语言中有如下几种模型来区分:
1、 初始化语句模型
顶层声明中,存在初始化语句是,表示这个声明是定义声明,其他声明是引用声明。C语言的所有文件之中,只能有一个定义声明。
按照这个模型,我们可以在first.h中定义如下TPYE G_test=1;那么就确定在first中的是定义声明,在其他的所有声明都是引用声明。
2、 省略存储类型说明
在这个模型中,所有引用声明要显示的包括存储类extern, 而每个外部变量的唯一定义声明中省略存储类说明符。
这个与我们对函数的处理方法类似,不再举例说明。
这里还有一个需要说明,本来与本文并不十分相关,但前一段有个朋友遇到此问题,相信很多人都会遇到, 那就是数组全局变量。
他遇到的问题如下:
在声明定义时,定义数组如下:
int G_glob[100];
在另一个文件中引用声明如下:
int * G_glob;
在vc中,是可以编译通过的, 这种情况大家都比较模糊并且需要注意,数组与指针类似,但并不等于说对数组的声明起变量就是指针。 上面所说的的程序在运行时发现了问题,在引用声明的那个文件中,使用这个指针时总是提示内存访问错误,原来我们的连接程序并不把指针与数组等同,连接时,也不把他们当做同一个定义,而是认为是不相关的两个定义,当然会出现错误。正确的使用方法是在引用声明中声明如下:
int G_glob[10];
并且最好再加上一个extern,更加明了。
extern int G_glob[10];
c语言能不能在一个文件中写一个函数,然后再另一个文件中调用?
ifndef __FUNCTION_H__define __FUNCTION_H__void func();endif \/\/ 以下是function.c 的内容 include "function.h"void func(){ \/\/ do something } 这样一来,我们想要在另外一个文件,也就是main.c 中调用这个函数的时候,只需要包含它对应的头文件,就可以直接调用了。\/\/ 以下是main.c 的...
MFC中如何调用C语言文件
可以按照以下方式进行,实行时不分先后。一、调用函数部分。1 引入头文件。头文件在C语言中,负责声明函数,及定义相关数据结构等功能。要调用其它C文件中的函数,标准的做法是引用头文件。2 如果不存在头文件,需要自行编写,也可以在引用文件中自行声明函数。不过后一种并不正规。3 在声明或引用头文件...
C语言中。如果编写了一个函数,想在不同源文件中调用。
在你要调用的程序文件里包含被调用程序的头文件,如1.h,1.c,在1.c里定义好了你的函数"void print_xxx(){}",在1.h里申明"void print_xxx();"了这个,然后另一个文件就可以调用了,文件的开头写上:#include "1.h"
C语言中,include是什么意思?
在C系统的编程语言中,#include是为了声明在这个地方插入别的文件中的代码。以#开头,包含某个头文件,如#include <stdio.h>,就是相当于引用stdio.h这个文件,然后这个文件里面所定义的一些函数就可以直接使用了。
C语言中头文件stdlib.h是干什么用的,怎么用?
常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。 具体的内容可以打开编译器的include目录里面的stdlib.h头文件查看。C语言为了方便用户编写程序,为用户开发了大量的库函数,其定义在.h文件中,用户可以调用这些函数实现强大的功能。
c语言中什么时候才用#include?
如果在代码中,调用了这个头文件中的函数或者宏定义,则需要引用该头文件。引用stdlib.h头文件,即#include <stdlib.h>。这里的.h是不可缺少的。stdlib.h中,包含了C语言的一些常用库函数。如动态内存相关的malloc, realloc,zalloc,calloc,free等。C语言是一门通用计算机编程语言,应用广泛。C语言的...
c语言exit是什么意思
C语言中的exit表示退出程序。详细解释如下:一、exit概述 在C语言中,`exit`是一个非常重要的函数,主要用于终止程序的运行并返回一个状态码给操作系统。该函数定义在`stdlib.h`头文件中。通过调用`exit`函数,程序可以结束当前的执行流程并退出。二、exit函数的使用 在程序中,当遇到某些特定条件或错误...
extern在c语言中是什么意思?
三、使用extern的关键点 值得注意的是,使用extern关键字只是声明一个变量或函数的存在,而不是定义它。定义通常发生在源文件的另一个位置或在头文件中。此外,当使用extern时,必须确保所引用的变量或函数确实在其他地方被定义,否则会导致链接错误。总的来说,extern关键字在C语言中用于指示一个变量或...
C语言里面的#include<stdio.h>和#include<math.h>是什么意思?
char*string)\/\/输出一个字符串到标准输出设备 char*gets(char*string)\/\/从标准输入设备读入一个字符 intsprintf(char*string,char*format[,…])\/\/格式化一个字符串输出到字符数组中,不显示 至于#include<math.h>)是数学函数库,你要调用各种数学函数有这个文件就能直接调用,否则要自己在编写。
C语言中定义头文件是<>还是“”
在C语言中<> 和“”都可以定义头文件。如果用的是<>那么程序首先会 在默认路径中去找要调用的文件,如果没有找到然后就在当前目录里面 找。如果用的是“”那么程序只会在当前目录下寻找要调用的文件。如果你是将 编程工具 和 调用的文件 放在一个文件目录中的话,那么用“”就不会有任何问题!
莫往枸櫞: 将某个源文件的函数写到一个头文件中包含在头文件中#include ""或者直接包含该源文件文件.
盐都区13942114565: 请问C语言怎么把函数放在头文件里面呢 - ?
莫往枸櫞: 你可以创建头文件,头文件是以".h"结尾的文件名,而main()函数所在的文件则是以".c"结尾的,".c"后缀的文件内部,也就是main函数内部主要是调用各个功能函数,函数的声明部分一般放在在".h"后缀的头文件中,这样是为了实...
盐都区13942114565: 如何编写C语言的.h头文件呀?并调用其中的函数. - ?
莫往枸櫞: 先新建一个MyHead.h内容通常自定义文件格式: #ifndef _MYHEAD_H_ #define _MYHEAD_H_ (这里是头文件的内容) #endif /* _MYHEAD_H_ */然后在你的.c中#include“MyHead.h”就可以了 记得放在一个工程目录下
盐都区13942114565: C语言如何编写一个头位件在里面有许多函数可以包含头文件后直接调用里面的函数,我用的是DevC++ - ?
莫往枸櫞: 先建立一个项目“文件-新建-项目-Console Application”,之后在左边的项目管理添加你的文件.这里假如我有main.cpp,file.cpp,file.h文件// file.cpp#include <stdio.h>#include "file.h" int f1(int x, int y) { return x>y?x:y; } void f2() { printf("Hello ...
盐都区13942114565: C语言函数如何相互调用 - ?
莫往枸櫞: A函数中做判断就可以了 type_ A(...) {while(1) {//do something if(...) //check { B(); //执行B后会继续循环. 如果要重新开始循环,可以把相关变量重新初始化 }}}
盐都区13942114565: 谁有C语言的所有头文件里面调用函数的代码? - ?
莫往枸櫞: C/C++头文件 #include //设定插入点 #include//字符处理 #include//定义错误码 #include//浮点数处理 #include //文件输入/输出 #include //参数化输入/输出 #include//数据流输入/输出 #include //定义各种数据类型最值常量 #...
盐都区13942114565: c语言能不能在一个文件中写一个函数,然后再另一个文件中调用??
莫往枸櫞: 可以,把文件写在一个工程里面, 一个主函数,调用, 一个文件写函数,函数声明 写到一个头文件, 然后把,头文件 放在主函数上面 就可以调用,
盐都区13942114565: C语言中怎样调用函数(举个例子)?
莫往枸櫞: main(){a(); } a(){int a = 0; } 这样,在main中调用a函数.
盐都区13942114565: 计算机c语言中函数之间如何调用 - ?
莫往枸櫞: 函数要先声明,后调用,如: #include<stdio.h> //包含头文件,头文件中含有一些函数的定义,包含它,相当于已经声明了下面的Printf函数 int main()//主函数 int sum(int x,int y) //在调用前要先声明,声明可以先不定义函数体,也可以在声...
盐都区13942114565: c语言中如何制作头文件,如何调用其他自己写地函数? - ?
莫往枸櫞: 可以新建一个头文件,struct.h#ifndef STRUCT_H#define STRUCT_H struct persons { char name[16]; char sex[6]; char age[3]; char bir[5]; char phnum[18]; char addr[20]; } persons[100];/*************************************************************************...