C编程笔录(一)1.0: 在C编程中,函数的声明为什么都习惯的写在头文件中,然后在需要调用的地方使用#include来包含?
2018-02-07 17:15
465 查看
问题:在C编程中,函数的声明为什么都习惯的写在头文件中,然后在需要调用的地方使用#include来包含?
带着这个问题,我创建了三个.c文件,分别命名a.c、b.c和c.c,并进行如下编程:
a.c文件:
int add(int a, int b)
{
return a + b;
}
b.c文件:
#include <stdio.h>
int add(int a, int b);
void print_sum(int a, int b)
{
printf("test two, sum=%d", add(a, b));
}
c.c文件:
#include <stdio.h>
int add(int a, int b);
void print_sum(int a, int b);
void main()
{
printf("test one, sum=%d", add(99 + 88));
print_sum(100, 200);
while(1);
}
从代码看,因为需求,int add(int a, int b);函数声明在b.c和c.c文件中都拷贝了一份,如果该函数的函数名、返回值或者形参后期需要修改,那么这时需要在a.c、b.c和c.c文件内都进行修改,如果拷贝的份数越多,那么后期代码修改同步时的维护工作量就越大。
OK,回到问题:在C编程中,函数的声明为什么都习惯的写在头文件中,然后在需要调用的地方使用#include来包含?
上面的例子代码中并没有将int add(int a, int b);函数的声明写在在头文件中,所以导致了“有多少处函数声明拷贝,后期函数声明修改就需要同步多少处代码”问题,那么下面改成将函数的声明写在头文件中,使用#include的方式来包含头文件:
再创建两个头文件,分别为a.h和b.h,并且进行如下编程:
a.h文件:
#ifndef __A_H__
#define __A_H__
int add(int, int);
#endif
b.h文件:
#ifndef __B_H__
#define __B_H__
#include <stdio.h>
#include "a.h"
void print_sum(int a, int b);
#endif
然后分别修改b.c和c.c文件如下:
b.c文件:
#include "b.h"
void print_sum(int a, int b)
{
printf("test two, sum=%d", add(a, b));
}
c.c文件:
#include "b.h"
void main()
{
printf("test one, sum=%d", add(99 + 88));
print_sum(100, 200);
while(1);
}
修改后的程序运行结果和修改前的一样,分析修改前后代码发现,将函数声明编写在一个头文件中,如果后期函数声明需要修改,那么只需要修改一个头文件里的函数声明即可。
总结问题答案:
函数的声明都习惯的编写在头文件中,然后在需要调用的地方使用#include包含可以避免函数的声明多处拷贝而导致的后期维护难问题。
带着这个问题,我创建了三个.c文件,分别命名a.c、b.c和c.c,并进行如下编程:
a.c文件:
int add(int a, int b)
{
return a + b;
}
b.c文件:
#include <stdio.h>
int add(int a, int b);
void print_sum(int a, int b)
{
printf("test two, sum=%d", add(a, b));
}
c.c文件:
#include <stdio.h>
int add(int a, int b);
void print_sum(int a, int b);
void main()
{
printf("test one, sum=%d", add(99 + 88));
print_sum(100, 200);
while(1);
}
从代码看,因为需求,int add(int a, int b);函数声明在b.c和c.c文件中都拷贝了一份,如果该函数的函数名、返回值或者形参后期需要修改,那么这时需要在a.c、b.c和c.c文件内都进行修改,如果拷贝的份数越多,那么后期代码修改同步时的维护工作量就越大。
OK,回到问题:在C编程中,函数的声明为什么都习惯的写在头文件中,然后在需要调用的地方使用#include来包含?
上面的例子代码中并没有将int add(int a, int b);函数的声明写在在头文件中,所以导致了“有多少处函数声明拷贝,后期函数声明修改就需要同步多少处代码”问题,那么下面改成将函数的声明写在头文件中,使用#include的方式来包含头文件:
再创建两个头文件,分别为a.h和b.h,并且进行如下编程:
a.h文件:
#ifndef __A_H__
#define __A_H__
int add(int, int);
#endif
b.h文件:
#ifndef __B_H__
#define __B_H__
#include <stdio.h>
#include "a.h"
void print_sum(int a, int b);
#endif
然后分别修改b.c和c.c文件如下:
b.c文件:
#include "b.h"
void print_sum(int a, int b)
{
printf("test two, sum=%d", add(a, b));
}
c.c文件:
#include "b.h"
void main()
{
printf("test one, sum=%d", add(99 + 88));
print_sum(100, 200);
while(1);
}
修改后的程序运行结果和修改前的一样,分析修改前后代码发现,将函数声明编写在一个头文件中,如果后期函数声明需要修改,那么只需要修改一个头文件里的函数声明即可。
总结问题答案:
函数的声明都习惯的编写在头文件中,然后在需要调用的地方使用#include包含可以避免函数的声明多处拷贝而导致的后期维护难问题。
相关文章推荐
- 把声明(如函数原型声明)放在头文件,并在需要时用#include指令把他们包含在源文件中,这么做有什么好处
- C语言,多个文件编程,使用不同.c文件的变量声明方法以及头文件的包含
- 以不同用户身份运行程序,/savecred只需要输入一次密码(GetTokenByName取得EXPLORER.EXE的令牌,然后调用CreateProcessAsUser,而且使用LoadUserProfile解决另存文件的问题)good
- 函数声明放在头文件中,函数的定义放在实现文件中,然后在主函数中调用
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(转)
- C编程笔录(一)1.1:使用#include包含头文件,用尖括号和双引号括起有什么区别?
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- 使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明
- 使用PB调用API自动更新(非FTP模式)(四、统计复制文件数量函数F_CONNECT_COPYCOUNT)
- PHP IN_ARRAY 函数使用需要注意的地方
- 使用前置声明取代包含头文件
- 在函数和包含头文件中使用extern "C" 的作用
- SDI 拆分窗口时 两个类似的视图,为什么一个头文件中需要声明DOC类,而另一个则不需要声明
- 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
- 在vim中使用cscope查找调用、定义函数和变量的地方
- 该文件可以包含在任何需要调用数据库的ASP文件头部,直接过虑掉非法注入
- php in_array 函数使用说明与in_array需要注意的地方说明
- 该文件可以包含在任何需要调用数据库的ASP文件头部,直接过虑掉非法注入
- 零基础学Qt 4编程实例之三:勾三股四弦必五—文件包含语句与标准库的使用
- PHP IN_ARRAY 函数 使用需要注意的地方