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语言是个入门用的东西,没有必要深入研究.但对计算机领域再稍加了解 ...
随机推荐
- ImagePacker
[下载]:ImagePacker 0.0.2 [作用]:将多个图片打包到指定大小的图片中,并输出配置文件.类似于 TexturePacker,不过当前只支持 Starling 格式输出(因为我现在使用 ...
- input子系统 KeyPad-Touch上报数据格式与机制
-----------------------------------------------------------------------本文系本站原创,欢迎转载!转载请注明出处:http://b ...
- 国外程序员整理的Java资源
好资料,慢慢学习.http://www.importnew.com/14429.html 构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理, ...
- Apache启动是出现the requested operation has failed
出现的原因: 原因一:80端口占用例如IIS,另外就是迅雷. 原因二:软件冲突装了某些软件会使apache无法启动如Dr.com 你打开网络连接->TcpIp属性->高级->WINS ...
- leetcode@ [315/215] Count of Smaller Numbers After Self / Kth Largest Element in an Array (BST)
https://leetcode.com/problems/count-of-smaller-numbers-after-self/ You are given an integer array nu ...
- 【noip2007】树网的核
题解: 首先我们要知道一个性质:如果有多条直径 这个核不论在哪条直径上 答案都是一样的 这样我们就可以随便找一条直径 在这条直径上枚举核的位置 并且dfs预处理maxlon[i] (i在直径上) 表示 ...
- 【AC自动机】专题总结
刷了一星期+的ac自动机的题目 做一个总结~ 我的ac自动机是之前省选的时候看老师给的一个网页上学的 由于找不到原文 就贴个转载的地址吧 - - http://hi.baidu.com/winterl ...
- HDU-4671 Backup Plan 构造解
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4671 假设是3 m,首先按照第一列按照1 2 3 1 2 3 1...排下去,然后个数就是一个 (m/ ...
- SGU223 - Little Kings(状态压缩DP)
题目大意 给定一个N*N(n<=10,k<=n*n)大小的棋盘,要求你在棋盘上放置k个国王,使得不会相互攻击,如果棋盘上某个格子放置了一个国王,那么与他相邻的八个格子都是他的攻击范围,问有 ...
- 单点登录与消息队列以及在J2EE中的实现方案
前言 这次为大家简单介绍两个在WEB开发中经常使用的概念——单点登录和消息队列以及具体到J2EE中的一些实现方案.本文原创性的工作比较少,主要是一些总结概括和自己的理解. 单点登录SSO SSO的业务 ...