C语言基础(15)-多文件编译
一.头文件的使用
如果把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)-多文件编译的更多相关文章
- C++语言基础(15)-友元函数和友元类
		一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来介绍一种例外情 ... 
- Java入门 - 语言基础 - 15.StringBuffer
		原文地址:http://www.work100.net/training/java-stringbuffer.html 更多教程:光束云 - 免费课程 StringBuffer 序号 文内章节 视频 ... 
- Java语言基础(15)
		1 综合案例 Demo1 设计一个父类Shape(图形类),抽象类常量:public static final double PI = 3.14;抽象方法:void show():输出每一个属性值vo ... 
- C语言include预处理命令与多文件编译
		#include预处理命令几乎使我们在第一次接触C的时候就会碰到的预处理命令,可我现在还不怎么清楚,这次争取一次搞懂. 一.#include预处理指令的基本使用 预处理指令可以将别处的源代码内容插入到 ... 
- GO学习-(15) Go语言基础之包
		Go语言基础之包 在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的.本文介绍了Go语言中如何定义包.如何导出包的内容及如何导入其他包. Go语言的包(packag ... 
- Ubuntu的多文件编译以及c语言的数组、函数
		闲言少叙,直接切入主题. 一.Linux下的多文件编译(Ubuntu系统). 对于小程序来说,往往一个.c文件就足够了,里面包含了各种主函数和功能函数,以及函数的声明等等.但是这样的弊端主要有两点,一 ... 
- C语言-------多文件编译
		(1)前段时间,学长讲解宏的一些知识 也提起了那个多文件编译,同过看别人的博客,自己也懂了一些,现在来总结一下这个多文件编译,其实和java里面的那个class的调用好像有联系 其定义即可以理解成: ... 
- Python Cookbook(第3版)中文版:15.19 从C语言中读取类文件对象
		15.19 从C语言中读取类文件对象¶ 问题¶ 你要写C扩展来读取来自任何Python类文件对象中的数据(比如普通文件.StringIO对象等). 解决方案¶ 要读取一个类文件对象的数据,你需要重复调 ... 
- C入门语言基础一[可移植性、涉及的三种文件、编程7个步骤、编译器、链接器]
		Review Questions What dose portability mean in the context of programming? 文中讲到的可移植性是什么意思? C本身是不涉及 ... 
随机推荐
- 【矩阵哈希】【哈希表】bzoj2351 [BeiJing2011]Matrix
			引用题解:http://blog.csdn.net/popoqqq/article/details/41084047 #include<cstdio> #include<cstrin ... 
- 【二分图】【最大匹配】【匈牙利算法】bzoj1191 [HNOI2006]超级英雄Hero
			裸的最大匹配. #include<cstdio> #include<vector> #include<cstring> using namespace std; v ... 
- 【博弈论】bzoj2463 [中山市选2009]谁能赢呢?
			∵都是最优操作 ∴n*n=偶数时Bob赢,否则Alice赢 n*n的奇偶性等价于n的奇偶性. #include<cstdio> using namespace std; int n; in ... 
- 开启关闭Centos的自动更新(转)
			开启关闭Centos的自动更新 关闭Centos的自动更新,操作记录如下: [root@jwbdb alpha]# chkconfig –list yum-updatesd yum-updatesd ... 
- Problem J: 求方程的解——C语言初学者百题大战之十五
			#include<stdio.h> #include<math.h> int main() { float a,b,c,x1,x2,delta; scanf("%f ... 
- [转] C/C++中printf和C++中cout的输出格式
			原文地址 一. Printf 输出格式 C中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型,其中方括号[]中的项为可选项.各项的意义介绍如下:1.类型类型字符用以表示输出数 ... 
- 【mybatis】mybatis方法访问报错:org.apache.ibatis.builder.IncompleteElementException: Could not find result map com.pisen.cloud.luna.ms.goods.base.domain.GoodsConfigQuery
			在调用mapper.xml中的方法的时候,报错: org.apache.ibatis.builder.IncompleteElementException: Could not find result ... 
- 【JVM】Myecplise自带的JVM大小调整,用于Junit等测试时使用
			一般在使用Junit或者一个工具类的main方法执行时,在Myecplise中运行,并不会占用多大的堆空间.如果出现OutofMemory错误,调整MyEcplise自带的JVM大小. 在Myecpl ... 
- Restful Web Service部署到weblogic 12c
			介绍一下环境: 首先需要下载一个jaxrs-ri-2.22.2.zip的包 采用Jdeveloper 12c版本,jdk1.8 WebLogic Server 12.2.1版本 Restful项目建立 ... 
- 《Javascript高级程序设计》的一些可疑点
			1.null和undefined的区别(出自第三章基本概念的3.4数据类型) 2.sort-比较函数(5.2.5重排序方法) 
