一.头文件的使用

如果把main函数放在第一个文件中,而把自定义函数放在第二个文件中,那么就需要在第一个文件中声明函数原型。如果把函数原型包含在一个头文件里,那么就不必每次使用函数的时候都声明其原型了。把函数声明放入头文件是很好的习惯。

二.#include 与 #define的意义

#include 是预编译指令,代表头文件包含。#define定义一个宏常量。

三.#ifdef #ifndef与#endif

#ifdef 这是个预编译指令,代表只要定义了一个常量,那么就预编译下面的代码

基本语法:

#ifdef 宏

代码

#endif

#ifndef也是个预编译指令,代表如果这个宏不存在,就编译下面的代码

#ifndef 宏 // 如果这个宏不存在,就编译下面的代码

代码

#endif

四.解决C语言头文件重复包含的问题

比如有一个外部引用的a.h头文件,那么在a.h头文件中应当这样定义:

    #ifndef ____AH____
#define ____AH_____
int mymax(int a, int b); // 声明
int add(int a, int b); // 声明
#endif

实际应用:

下面是在一个C文件中使用另一个C文件中定义的函数并包含其头文件的例子。

test.c

#include <stdio.h> // 这个头文件在系统目录下
#include <stdlib.h> // 使用了system函数
#include "a.h" // 这个头文件在当前目录下 void main() { /*char *a = "hello1234";
printf("当前字符串的长度为:%d\n",mystrlen(a,0));*/ for (int i = ; i < ; i++) {
printf("第%d个数的结果为:%d\n",i,fib(i));
}
system("pause");
}

a.h

#ifndef __AH__
#define __AH__ int mystrlen(const char *p, int n); // 计算当前字符串长度
int fib(int n); // 斐波那契数列
int getBinary(int n); // 将十进制数转换为二进制数
int getAge(int n); // 计算第n个人的年龄
void decreasing(int n); // 先序递归 输出结果:10 9 8 7 6 5 4 3 2 1
void increasing(int n); // 后序递归 输出结果:1 2 3 4 5 6 7 8 9 10 #endif

a.c

#include <stdio.h>

// 计算当前字符串长度
int mystrlen(const char *p, int n) { if (p[n]) { // 这里判断是否到达字符串末尾的0
return mystrlen(p, n + );
}
else {
return n;
} } // 斐波那契数列
int fib(int n) { if (n == )
return ;
if (n == )
return ;
if (n > )
return fib(n - ) + fib(n - ); } //将十进制数转换为二进制数
void getBinary(int n) { int i = n % ;
if (n >= ) {
getBinary(n / );
}
printf("%d", i);
} // 计算第n个人的年龄
int getAge(int n) { int age;
if (n == ) {
age = ;
}
else{
age = getAge(n - ) + ;
}
return age; } // 先序递归 输出结果:10 9 8 7 6 5 4 3 2 1
void decreasing(int n) { if (n > ){ // 递归终止条件,递归一定要有终止条件
printf("n=%d\n", n);
decreasing(n - );
}
} // 后序递归 输出结果:1 2 3 4 5 6 7 8 9 10
void increasing(int n) { if (n > ) {
increasing(n - );
printf("n=%d\n", n);
} }

C语言基础(15)-多文件编译的更多相关文章

  1. C++语言基础(15)-友元函数和友元类

    一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来介绍一种例外情 ...

  2. Java入门 - 语言基础 - 15.StringBuffer

    原文地址:http://www.work100.net/training/java-stringbuffer.html 更多教程:光束云 - 免费课程 StringBuffer 序号 文内章节 视频 ...

  3. Java语言基础(15)

    1 综合案例 Demo1 设计一个父类Shape(图形类),抽象类常量:public static final double PI = 3.14;抽象方法:void show():输出每一个属性值vo ...

  4. C语言include预处理命令与多文件编译

    #include预处理命令几乎使我们在第一次接触C的时候就会碰到的预处理命令,可我现在还不怎么清楚,这次争取一次搞懂. 一.#include预处理指令的基本使用 预处理指令可以将别处的源代码内容插入到 ...

  5. GO学习-(15) Go语言基础之包

    Go语言基础之包 在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的.本文介绍了Go语言中如何定义包.如何导出包的内容及如何导入其他包. Go语言的包(packag ...

  6. Ubuntu的多文件编译以及c语言的数组、函数

    闲言少叙,直接切入主题. 一.Linux下的多文件编译(Ubuntu系统). 对于小程序来说,往往一个.c文件就足够了,里面包含了各种主函数和功能函数,以及函数的声明等等.但是这样的弊端主要有两点,一 ...

  7. C语言-------多文件编译

    (1)前段时间,学长讲解宏的一些知识  也提起了那个多文件编译,同过看别人的博客,自己也懂了一些,现在来总结一下这个多文件编译,其实和java里面的那个class的调用好像有联系 其定义即可以理解成: ...

  8. Python Cookbook(第3版)中文版:15.19 从C语言中读取类文件对象

    15.19 从C语言中读取类文件对象¶ 问题¶ 你要写C扩展来读取来自任何Python类文件对象中的数据(比如普通文件.StringIO对象等). 解决方案¶ 要读取一个类文件对象的数据,你需要重复调 ...

  9. C入门语言基础一[可移植性、涉及的三种文件、编程7个步骤、编译器、链接器]

    Review Questions What dose portability mean in the context of programming? 文中讲到的可移植性是什么意思?   C本身是不涉及 ...

随机推荐

  1. thinkpad win8.1 无线连接受限

    把博通的驱动回滚到6.30.223.102就好了

  2. 【AC自动机】zoj3228 Searching the String

    对所有模式串建立AC自动机. 每个单词结点要记录该单词长度. 然后在跑匹配的时候,对每个单词结点再处理3个值,代表可重叠的匹配次数,不可重叠的匹配次数,以及“上一次不可重叠的匹配位置”,这样结合单词长 ...

  3. 获取OS X中App Store更新后的安装包(如XCode)

    如果宿舍有好几个人需要更新一些大的软件,如XCode,会占用很大的带宽.   为了节省带宽,我们可以在1台电脑上更新完后,获取存放在系统暂存区的更新的安装包,然后通过局域网或Airdrop的方式轻松分 ...

  4. JavaScript跳转到页面某个锚点#

    JavaScript跳转到页面某个锚点: scroll(0, document.getElementById('锚点ID').offsetTop);

  5. JAVA常见算法题(二十五)

    /** * Java实现中文数字转换为阿拉伯数字 * * * @author WQ * */ public class Demo26 { public static void main(String[ ...

  6. Kubernetes环境下调整WebLogic JVM基本参数

    基于Kubernetes启动WebLogic后,发现JVM的最大heap size一直在700多M左右,通过 kubectl logs 察看pod启动状态,发现日志中并没有-Xms和-Xmx参数.日志 ...

  7. WebLogic MBean Monitor

    weblogic server提供了一个dashboard让我们对mbean进行图形化的展现和分析,地址是 http://localhost:7001/console/dashboard 但有时候总是 ...

  8. C#中的访问修饰符

    1. 简述 private. protected. public. internal 修饰符的访问权限.private : 私有成员, 在类的内部才可以访问.protected : 保护成员,该类内部 ...

  9. 使用Python开发SQLite代理服务器(转载)

    转载:https://mp.weixin.qq.com/s?timestamp=1498531736&src=3&ver=1&signature=Eq6DPvkuGJi*G5s ...

  10. 【Linux】pv vg lv, 加盘,扩容磁盘

    PV VG LV关系:一个物理盘(或一个lun)就是一个pv,有几个物理盘就有几个pv.一个或者几个硬盘可以组成一个vg,一个系统可以包括好几个vg,比如rootvg ,datavg等 PV组成VG, ...