{
returnmean(mean(a,b), mean(c,d));// 调用了 utils.h 里的 mean 函数
}
// file name : main.c
// version : 2
// 增加了对other.h的引用
#includestdio.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文件也应如此,这里就留给同学自己添加了 。
参考网址:
如何编写C语言的.h头文件呀?并同一个 。h调用其中的函数 。首先建头文件是为c语言创建h函数了声明c文件中的函数c语言创建h函数,以及包括宏定义 。建立头文件要有对应的c文件 。我简单地谢了一个c文件c语言创建h函数 , 里面有一个函数 。
下面要写头文件首先要建一个.h文件
打开h文件c语言创建h函数,进行编辑 。建立头文件是有一定步骤的 。要用到#ifndef 。。。#define 。。。。#endif 。这是为了避免重复定义
#ifndef后面要写的是头文件名称的大写 。例如:test.h要写成__TEST_H__ 。前面与后面是两个下划线 。字母用大写
然后在define与endif中间声明你的函数名,记得写冒号呦 。
然后在main文件中写上include这个头文件 , 就可以调用了 。
然后编译 , 运行 , 就OK了 。祝大家学习愉快 。
推荐阅读
- phpcms链接地址,phpcms使用教程
- c语言输出每三个数字换行的简单介绍
- IOS10平板无法更新微信,pad1033微信无法更新
- rpgmaker制作动作游戏,rpg 游戏制作
- vb.net的报表 vbnet chart
- redis生产环境搭建,redis sentinel搭建
- u盘下载后怎么删除照片,下载的u盘
- 模拟游戏开发商的游戏,模拟游戏开发公司哪家好
- vb.net文本框 vb文本框selstart