C语言多个源文件编译
多源文件编译:
新建一个 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语言多个源文件编译的更多相关文章
- Mac上把python源文件编译成so文件
把python源文件编译成so文件 前言 实际上属于一种代码混淆/加密的技术,大家知道python的源文件放在那里,大家是都可以看的,不像C语言编译出来可以拿编译后的东西去运行,所以就出现了这种需求. ...
- Linux下C语言多文件的编译以及makefile的应用
1.关于编译和链接 一般来说,无论是C.C++,首先要把源文件编译成中间代码文件,在Windows下也就是.obj文件,UNIX下是.o文件,即Object File,这个动作叫做编译(compile ...
- Java源文件编译成功但是运行时加载不到文件
最近系统重装了一些,Java等环境变量都需要重新配置,配置好以后编写了一个Java源文件编译了一下,通过Javac编译源文件,编译成功,但是再通过Java运行时没找到报出找不到加载文件或者加载文件不存 ...
- 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】
最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...
- Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类。 混合编程中使用COM接口指针
Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类. Microsoft.VisualC.StlClr Unmanaged Code 和 Managed Co ...
- c语言条件编译和预编译
转自http://www.cnblogs.com/rusty/archive/2011/03/27/1996806.html 一.C语言由源代码生成的各阶段如下: C源程序->编译预处理-> ...
- 如何使用emacs编写c语言程序,并编译运行
vi和emacs被分别被称为编辑器之神和神之编辑器.vi的入门精通都很难,emacs入门容易,精通难:vi使用起来不停地切换模式,而emacs则不停地ctrl,meta等组合键.因此,高德纳大师说操作 ...
- C语言简短程序gcc编译过程
一.建立一个×.c源文件.这里起名:rocks.c 二.编辑源代码,在c源文件内输入如下代码: #include <stdio.h> int main() { puts("C R ...
- C语言笔记——简介与编译过程初探
序言 从今天起,详细说说C语言.这一年多,在大多数语言和技术之间转了一大圈,终于看清楚了事实,决心静下心来好好学学C语言.初学者会认为C语言是个入门用的东西,没有必要深入研究.但对计算机领域再稍加了解 ...
随机推荐
- JRebel 5.3.2
http://www.blogjava.net/xylz/archive/2013/09/15/404098.html 此为单文件版本,无需license文件 IDE(Eclipse.IDEA可能 ...
- [King.yue]Ext.net 弹出Windows窗体注意的事项
页面的控件ID不能重复,否则会覆盖原控件.
- bug描述注意点
一个好的错误跟踪系统包括了错误的必要信息,如果做得不好,会造成迷惑,并误导读者.好的故障描述应该包括十个基本部分:标题.项目.所属模块.优先级.重要性.异常等级.可重复性.现象.操作过程和附件. ①标 ...
- e2e 自动化集成测试 环境搭建 Node.js Selenium WebDriverIO Mocha Node-Inspector
Node.js已经出来了许多年载,至今才开始接触.周未在家闲来无事,一时心血来潮,Google了大量的文章,经过实验,终于可以把整个环境给搭起来, 废话不多话,请看步骤. 特别注意, 本文章是针对Wi ...
- <转>Redis 应用场景
http://blog.csdn.net/hguisu/article/details/8836819 1. MySql+Memcached 架构的问题 Memcached采用客户端-服务器的架构, ...
- C: Answers to “The C programming language, Edition 2”
<The C programming language> Edition 2的习题答案地址: http://users.powernet.co.uk/eton/kandr2/index.h ...
- 【DOM】学习笔记
三. 一份文档就是一颗节点树 节点类型:元素节点——属性节点.文本节点 getElementById()返回一个对象,对应一个元素节点 getElementByTagName()返回一个对象数组,分别 ...
- C++ 继承之虚继承与普通继承的内存分布
仅供互相学习,请勿喷,有观点欢迎指出~ class A { virtual void aa(){}; }; class B : public virtual A { ]; //加入一个变量是为了看清楚 ...
- Oracle数据库中truncate命令和delete命令的区别
首先讲一下,truncate命令: 语法:TRUNCATE TABLE table; 表格里的数据被清空,存储空间被释放. 运行后会自动提交,包括之前其它未提交的会话,因而一旦清空无法回退. 只有 ...
- hdu 3617 Happy 2009
Happy 2009 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...