如何在c语言中定义函数在.h文件,和在新文件中使用 C语言 有很多.h和.c文件,然后一个.c文件中的函数会调用...

C\u8bed\u8a00\u4e2d\u51fd\u6570\u5b9e\u73b0\u7684.c\u6587\u4ef6include\u51fd\u6570\u58f0\u660e\u7684,h\u6587\u4ef6\u6709\u4ec0\u4e48\u4f5c\u7528\uff1f

\u3000\u3000\u5934\u6587\u4ef6\u662f\u7ed9\u7f16\u8bd1\u5668\u7528\u7684

\u3000\u3000\u7f16\u8bd1\u5668\u5728\u7f16\u8bd1c\u6587\u4ef6\u7684\u65f6\u5019\uff0c\u9700\u8981\u5bf9\u5176\u4e2d\u7684\u51fd\u6570\u8c03\u7528\u505a\u68c0\u67e5\uff0c\u4ee5\u4fbf\u77e5\u9053\u51fd\u6570\u53c2\u6570\u4e2a\u6570\u3001\u7c7b\u578b\u3001\u8fd4\u56de\u503c\u7b49\u662f\u5426\u6b63\u786e\u3002\u7f16\u8bd1\u7684\u987a\u5e8f\u662f\u6309\u7167\u4ee3\u7801\u4e66\u5199\u4ece\u524d\u5230\u540e\u8fdb\u884c\u7684\uff0c\u5982\u679c\u4f60\u7684\u51fd\u6570\u5199\u5728\u524d\u9762\uff0c\u5219\u7f16\u8bd1\u5230\u8c03\u7528\u8fd9\u4e2a\u51fd\u6570\u7684\u8bed\u53e5\u7684\u65f6\u5019\uff0c\u7531\u4e8e\u5df2\u7ecf\u8ba4\u8bc6\u4e86\u8fd9\u4e2a\u51fd\u6570\uff0c\u6240\u4ee5\u4e5f\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u6709\u65f6\u5019\u6211\u4eec\u4f1a\u628a\u51fd\u6570\u7684\u5b9e\u73b0\u5199\u5728\u8c03\u7528\u8bed\u53e5\u7684\u540e\u9762\uff0c\u8fd9\u65f6\u5019\u5c31\u9700\u8981\u5728\u524d\u9762\u4e66\u5199\u4e2a\u51fd\u6570\u7684\u58f0\u660e\uff0c\u544a\u8bc9\u7f16\u8bd1\u5668\u6211\u540e\u8fb9\u6709\u4e2a\u67d0\u67d0\u7c7b\u578b\u7684\u51fd\u6570\u3002\u3002\u5982\u679c\u628a\u5927\u91cf\u7684\u58f0\u660e\u5199\u5728 .c \u4ee3\u7801\u91cc\uff0cc\u6587\u4ef6\u4e5f\u4f1a\u6bd4\u8f83\u4e71\uff0c\u6240\u4ee5\u7528 .h \u6587\u4ef6\u6765\u5b58\u50a8\u8fd9\u4e9b\u58f0\u660e\uff0c.c \u6587\u4ef6\u8981\u7528\u8fd9\u4e9b\u58f0\u660e\u7684\u65f6\u5019\uff0c\u53ea\u9700\u8981 #include \u5373\u53ef\uff0c\u5982\u679c\u662f\u7cfb\u7edf\u51fd\u6570\uff0c\u7528 #include \uff0c\u5982\u679c\u662f\u81ea\u5b9a\u4e49\u5934\u6587\u4ef6\uff0c\u5219\u7528 #include "xxx.h" \u3002
\u3000\u3000\u4f60\u7684\u4ee3\u7801\u4e2d a.c \u6ca1\u6709\u5fc5\u8981\u5305\u542b a.h \uff0c\u56e0\u4e3a\u5e76\u6ca1\u6709\u8c03\u7528\u8be5\u51fd\u6570\u800c\u662f\u8be5\u51fd\u6570\u7684\u5b9e\u73b0\uff0c\u4f46 main \u51fd\u6570\u6240\u5728\u7684 main.c \u7528\u5230\u4e86 add \uff0c\u6240\u4ee5\u5fc5\u987b\u5305\u542b a.h

\u697c\u4e3b\u4f60\u597d\u3002
.h\u6587\u4ef6\u4f5c\u4e3a\u63a5\u53e3\u5b58\u5728\u7684\u3002\u6240\u8c13\u63a5\u53e3\u5c31\u662f\u6307\u7c7b\u578b\u5b9a\u4e49\u3001\u53d8\u91cf\u58f0\u660e\u3001\u51fd\u6570\u58f0\u660e\u7b49\u7b49\uff0c\u57fa\u672c\u4e0a\u4e0d\u4f1a\u5728.h\u91cc\u9762\u653e\u7f6e\u51fd\u6570\u5b9e\u73b0\u3002
.c\u91cc\u9762\u624d\u771f\u6b63\u5b9e\u73b0\u51fd\u6570\u3002
\u6bd4\u65b9\u8bf4\uff0c\u6211\u5199\u4e00\u4e2awork\u7684\u5b9e\u73b0\uff1a
//work.h
#ifndef work_h
#define work_h
//\u4f60\u4e5f\u53ef\u4ee5\u5728\u8fd9\u91cc\u58f0\u660e\u53d8\u91cf\uff0c\u6216\u8005\u5b9a\u4e49\u7c7b\u578b\u3001\u7ed3\u6784\u4f53
void work();//\u6ce8\u610f\u8fd9\u53ea\u662f\u4e00\u4e2a\u51fd\u6570\u58f0\u660e
#endif

//work.c
//work\u51fd\u6570\u7684\u5b9a\u4e49\uff0c\u6216\u8005\u8bf4\u5b9e\u73b0
void work(){
//\u8fd9\u91cc\u624d\u771f\u6b63\u5b9e\u73b0work\u4e2d\u7684\u4ee3\u7801
}
\u8fd9\u6837\u4e00\u6765\uff0c\u5982\u679c\u4f60\u60f3\u7528work.c\u4e2d\u7684work\u51fd\u6570\uff0c\u53ea\u8981#include "work.h"\u5c31\u53ef\u4ee5\u4e86\u3002

\u5c0f\u6280\u5de7\uff1a
#ifndef work_h
#define work_h
#endif

\u8fd9\u4e09\u884c\u4ee3\u7801\u662f\u4e3a\u4e86\u4fdd\u8bc1\u5728\u7f16\u8bd1\u67d0\u4e00\u4e2a.c\u6216.cpp\u6587\u4ef6\u65f6\uff0cwork.h\u5934\u6587\u4ef6\u53ea\u7f16\u8bd1\u4e00\u6b21\u3002
\u6bd4\u65b9\u4f60\u5728main.c\u91cc\u9762\u6253\u4e8610\u6b21#include "work.h"\uff0c\u8fd9\u6837\u9884\u5904\u7406\u7684\u65f6\u5019\u4f1a\u5411main.c\u4e2d\u62f7\u8d1d10\u6b21work.h\u7684\u4ee3\u7801\uff08\u9884\u5904\u7406\u65f6\u5b9e\u9645\u4e0a\u4f1a\u7528work.h\u4e2d\u7684\u4ee3\u7801\u66ff\u4ee3#include "work.h"\u8fd9\u884c\u4ee3\u7801\uff09\uff0c\u6709\u4e86\u90a3\u4e09\u884c\u5c31\u53ef\u4ee5\u4fdd\u8bc1\u53ea\u6709\u7b2c\u4e00\u4e2a\u62f7\u8d1d\u7684work.h\u53c2\u4e0e\u7f16\u8bd1\uff0c\u5269\u4e0b\u7684\u4e5d\u4e2a\u90fd\u8df3\u8fc7\u3002\uff08\u56e0\u4e3awork_h\u5728\u7b2c\u4e00\u6b21#include\u7684\u65f6\u5019\u88ab\u5b9a\u4e49\u4e86\uff0c\u5f80\u540e\u5c31\u4e0d\u4f1a\u7f16\u8bd1#ifndef .. #endif \u4e2d\u95f4\u7684\u4ee3\u7801\u4e86\uff09

额,书上都有吧。
一般来说,头文件(.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;
a = 1.0;
b = 3.0;
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;
a = 1.0;
b = 3.0;
c = 4.0;
d = 2.0;
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文件也应如此,这里就留给同学自己添加了。

参考网址:http://lencomputer.pku.edu.cn/sk2007/lesson11/lab/head.html

建立一个a.h文件,在其中声明函数
void enter_string(char str[80]);
在b.c中包括 a.h文件。
#include "a.h"
当然,这样的前提条件是a.h,a.c,b.c这三个文件放在同一个目录下(各个编译器可能不太一样)
也可以把a.c做成lib文件,也是一样的

1、打开或者新建.h文件;
2、在该文件中添加你的函数;
3、保存退出,记住该文件名及其路径;
4、在新文件中包含该文件名,如果该文件不在搜索路径下,则包含该文件的全名
比如:
定义一个函数void mydefun(){}
调试无误后,以文件名aa.h保存在D:\abc目录下
在新文件中要用到这个函数,则包含语句中必须有以下一条语句:
#include"D:\\abc\\aa.h"
然后你就可以调用mydefun()函数了。

扩展阅读:c++编程 ... c语言%h ... c语言自定义函数例子 ... c#主函数调用定义函数 ... c语言定义函数void和int ... c语言中gets的用法 ... c语言arr在循环中的用法 ... c语言max函数三者大小 ... c语言中怎么定义一个函数 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网