一.头文件的使用

如果把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. [BZOJ3944]Sum(杜教筛)

    3944: Sum Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6201  Solved: 1606[Submit][Status][Discuss ...

  2. URAL 2072 Kirill the Gardener 3 (单调DP)

    [题目链接] http://acm.timus.ru/problem.aspx?space=1&num=2072 [题目大意] 一个园丁要给一排花浇水,每个花都有一个标号,必须要先浇标号小的, ...

  3. 【kmp算法】uva11475 Extend to Palindrome

    就把每个串倒过来,和原串匹配,看最后能匹配多少就行. #include<cstring> #include<algorithm> #include<cstdio> ...

  4. 【第二类Stirling数】Gym - 101147G - The Galactic Olympics

    如果K>n,就无解: 如果K==n,就答案是P(n,n): 如果K<n,答案就是s(n,K)*P(K,K): P为排列数,s为第二类斯特林数. 第二类斯特林数就是将n个球,划分为K个非空集 ...

  5. 【二分】【动态规划】Codeforces Round #393 (Div. 1) B. Travel Card

    水dp,加个二分就行,自己看代码. B. Travel Card time limit per test 2 seconds memory limit per test 256 megabytes i ...

  6. 【块状树】bzoj3731 Gty的超级妹子树

    带 加点 删边的块状树. 加点在 bzoj3720 说过. 删边其实就是块顶打标记,记录其属于哪棵树,防止在dfs搜集答案时跑到别的树上. 然后暴力把所在块拆开. 好像用邻接表存图,直接在vector ...

  7. 【分块】bzoj3226 [Sdoi2008]校门外的区间

    题解见 : http://blog.csdn.net/iamzky/article/details/41088151 ORZ ZKY 2个懒标记:是否翻转,覆盖成了什么. 怎么处理一个块上有两个标记的 ...

  8. 狗日的Javascript中的闭包

    前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...

  9. 取代Promise的Generator生成器函数

    接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还有一种常用的解决方案,它就是Ge ...

  10. spring融合activitymq-all启动报错的解决办法

    报错信息: nested exception is java.lang.NoSuchMethodError: org.springframework.core.annotation.Annotated ...