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本身是不涉及 ...
随机推荐
- [九省联考2018]林克卡特树(DP+wqs二分)
对于k=0和k=1的点,可以直接求树的直径. 然后对于60分,有一个重要的转化:就是求在树中找出k+1条点不相交的链后的最大连续边权和. 这个DP就好.$O(nk^2)$ 然后我们完全不可以想到,将b ...
- 【计算几何】【凸包】bzoj1670 [Usaco2006 Oct]Building the Moat护城河的挖掘
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...
- 6.4(java学习笔记)转换流
一.乱码问题 我们来看下列例子: public class ConStream { //当前平台默认采用GBK public static void main(String[] args){ Stri ...
- Problem H: 计算数列和2/1,3/2,5/3,8/5......
#include<stdio.h> int main(){ int i,n; scanf("%d",&n); float sum=0.0; ; ; ;i< ...
- 部署Redis 成windows服务
Redis是可以安装成windows服务的,开机自启动,命令如下: redis-server --service-install redis.windows.conf 安装完之后,就可看到Redis已 ...
- Java笔记4:JDBC纯驱动方式连接Oracle
JDBC纯驱动方式连接Oracle 1 下载Oracle提供的驱动程序包 下载地址: http://www.oracle.com/technetwork/database/enterprise-edi ...
- IReferenceCounted DotNetty.Common
// Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file ...
- [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket错误解决方法总结
今天做一个特殊的业务处理,用JDBC连接SQLServer数据库载入驱动的时候,报例如以下错误: java.sql.SQLException: [Microsoft][SQLServer 2000 D ...
- window onload 与 img onload事件
window onload 与 img onload事件 通常,window.onload就是载入完dom之后运行的. 而img就是载入完图片完运行它的onload事件.依据img的src是否载入完毕 ...
- 初识FASTBuild 一个大幅提升C/C++项目编译速度的分布式编译工具
FASTBuild 是一款高性能.开源的构建系统,支持高度可扩展的编译,缓存和网络分发. 以上是FASTBuild官网对其产品的一句话介绍. FASTBuild 的开源地址:https://githu ...