多源文件编译:

新建一个 main.c

#include <stdio.h>
#include <stdlib.h> int main(){
int i = myMax(,);
printf("i = %d",i);
system("pause");
return ;
}

然后再创建一个 a.c

int myMax(int a,int b) {
if(a>b)
return a;
return b;
}

然后编译

如果不是 visual studio C++ 的环境的话,会报错的。所以我用了dev C++就报了错。

错误信息:

8 21 F:\c++codeInDev\多源文件编译\main.c [Error] 'myMax' was not declared in this scope

说 myMax 没这个函数。

所以 需要一个 函数的声明。

main.c 代码:

#include <stdio.h>
#include <stdlib.h> int myMax(int a,int b); int main(){ int i = myMax(,);
printf("i = %d",i);
system("pause");
return ; }

第二种写法——采用加载头文件的方式:

main.c 代码:

#include <iostream>
#include "a.h"
int main() {
printf("较大的数字是:%d\n",myMax(,));
return ;
}

a.h代码:

int myMax(int a,int b);

a.c 代码:

int myMax(int a,int b){
if(a>b)
return a;
return b;
}

扩展:

main.c代码

#include <iostream>
#include "a.h"
#include "b.h"
int main() {
printf("较大的数字是:%d\n",myMax(,));
printf("两数之和是:%d\n",myAdd(,));
return ;
}

a.c代码:

int myMax(int a,int b){
if(a>b)
return a;
return b;
}

a.h 代码:

int myMax(int a,int b){
if(a>b)
return a;
return b;
}

b.h 代码:

int myAdd(int a, int b);

b.c 代码:

int myAdd(int a, int b){
return a+b;
}

运行结果示例:

马上要引出一个 别的事儿:

【dev竟然不可以复制文件夹,估计有什么隐含设置。。。在 android里面 和 javaweb里面都有这么一个东西的。android太久不弄有点儿忘记了,在 javaweb里面,选中一个项目,摁住alt+Enter,然后 搜索 web。然后再修改这个 项目的名称,否则当前复制的项目会覆盖之前的那个项目。在发布之后】

那就在 这个 上面改吧。。。

如果 b.h 里面包含了 a.h 那么会出现什么样的状况呢?

修改后的b.h:

#include "a.h"
int myAdd(int a, int b);

好吧,竟然没有问题。

但是 理论上这样多包含了一个 int myMax(int a,int b);就相当于重复的声明在main.c了照理说是不可以的。

所以诞生了 #ifndef #define #endif

所以把程序 写成这样:

好吧 就是 想引入这个 如果 没有定义的话,就定义 这样一个 概念。

示例代码://我们可以学着照抄人家的代码,人家的这种.h 文件基本上都是这样做的。完后看基本上都是 #endif 结尾的

修改的部分:

a.h 代码:

#ifndef _AH
#define _AH
int myMax(int a,int b);
#endif

b.h 代码:

#ifndef _BH
#define _BH
int myAdd(int a, int b);
#endif

这是 原来本身c语言里面提供的类库文件的书写格式,下面截了个图

可以看到人家也是这么操作的。

相关描述:

extern 是c++特有的!声明这段东西要以,C的方式编译。用在 dll的书写上,dll这个 东西真的是很神奇。是动态加载的类库文件。这种动态加载是在程序运行的时候,把当前这个 exe文件和exe所需要的dll文件一起在内存中开辟一块空间。所以这样就导致exe做出来可以很小。但是对于静态的lib来说。需要一起打包在exe文件中,这样exe就很大。并且每次改动都需要重新编译exe文件。但是对于dll的话,只需要重新编译这一部分,然后把dll放到对应目录下面,就可以了。并且,通常情况下,高级语言开发上层,逻辑部分很迅速。但是用c就很乏力,但是对于某些必须要操作硬件的部分就只能使用C开发好dll,然后可以让java等上层语言进行调用。这样的语言除了java还有 C++,python等等.

C语言多个源文件编译的更多相关文章

  1. Mac上把python源文件编译成so文件

    把python源文件编译成so文件 前言 实际上属于一种代码混淆/加密的技术,大家知道python的源文件放在那里,大家是都可以看的,不像C语言编译出来可以拿编译后的东西去运行,所以就出现了这种需求. ...

  2. Linux下C语言多文件的编译以及makefile的应用

    1.关于编译和链接 一般来说,无论是C.C++,首先要把源文件编译成中间代码文件,在Windows下也就是.obj文件,UNIX下是.o文件,即Object File,这个动作叫做编译(compile ...

  3. Java源文件编译成功但是运行时加载不到文件

    最近系统重装了一些,Java等环境变量都需要重新配置,配置好以后编写了一个Java源文件编译了一下,通过Javac编译源文件,编译成功,但是再通过Java运行时没找到报出找不到加载文件或者加载文件不存 ...

  4. 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】

    最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...

  5. Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类。 混合编程中使用COM接口指针

    Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类. Microsoft.VisualC.StlClr Unmanaged Code 和 Managed Co ...

  6. c语言条件编译和预编译

    转自http://www.cnblogs.com/rusty/archive/2011/03/27/1996806.html 一.C语言由源代码生成的各阶段如下: C源程序->编译预处理-> ...

  7. 如何使用emacs编写c语言程序,并编译运行

    vi和emacs被分别被称为编辑器之神和神之编辑器.vi的入门精通都很难,emacs入门容易,精通难:vi使用起来不停地切换模式,而emacs则不停地ctrl,meta等组合键.因此,高德纳大师说操作 ...

  8. C语言简短程序gcc编译过程

    一.建立一个×.c源文件.这里起名:rocks.c 二.编辑源代码,在c源文件内输入如下代码: #include <stdio.h> int main() { puts("C R ...

  9. C语言笔记——简介与编译过程初探

    序言 从今天起,详细说说C语言.这一年多,在大多数语言和技术之间转了一大圈,终于看清楚了事实,决心静下心来好好学学C语言.初学者会认为C语言是个入门用的东西,没有必要深入研究.但对计算机领域再稍加了解 ...

随机推荐

  1. UVAlive3662 Another Minimum Spanning Tree 莫队算法

    就是莫队的模板题 /* Memory: 0 KB Time: 1663 MS Language: C++11 4.8.2 Result: Accepted */ #include<cstdio& ...

  2. Java HashMap存储问题

    public static boolean isIsomorphic(String s, String t) { Map map1 = new HashMap<>(); Map map2 ...

  3. as3+java+mysql(mybatis) 数据自动工具(五)

    现在介绍常量的配置,主要用于客户端(as3)与服务端(java)之间的常量同步,比如错误码.请求标识等 配置格式: <macros name="Macros" groupSt ...

  4. 怎么解决div覆盖内容却没覆盖的问题?

    一.在上下结构的div布局中,可能出现div覆盖div,但是内容却没有出现覆盖的现象.看看一个示例 1: <!DOCTYPE html> 2: <html> 3: <he ...

  5. C语言基础--结构体对齐,位域,联合体

    结构体对齐 1--结构体对齐的原因与意义 许多计算机系统对基本数据类型的可允许地址做出了一些限制,要求某种类型的对象的地址必须是某个值K(通常是2,4,8)的倍数,而这个k则被称为该数据类型的对齐模数 ...

  6. wuzhicms页面报错 Notice 错误,如何关闭错误显示!

    错误类型类似: PHP Notice: Use of undefined constant E_DEPRECATED - assumed 'E_DEPRECATED' in D:\freehost\3 ...

  7. setBackgroundMusicLoop for cocos2dx

    给cocos2dx的SimpleAudioEngine加上设置背景音乐循环的方法,详见gist.

  8. POJ1185 - 炮兵阵地(状态压缩DP)

    题目大意 中文的..直接搬过来... 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

  9. EM算法原理简析——图解

    一. 扯淡 转眼间毕业快一年了,这期间混了两份工作,从游戏开发到算法.感觉自己还是喜欢算法,可能是大学混了几年算法吧!所以不想浪费基础... 我是个懒得写博客的人,混了几年coding,写的博客不超过 ...

  10. Android实例-拍摄和分享照片、分享文本(XE8+小米2)

    结果: 1.分享文本不好使,原因不明.有大神了解的,请M我,在此十分感谢. 2.如果想支持图片编辑,将Action事件的Editable改为True. 相关资料: 官网地址:http://docwik ...