多文件协作,extern、static、头文件
多个cpp文件协同工作。使用外部函数、变量时,必须先声明再使用。
声明外部函数(一般在main.cpp中),extern可省略(主函数中默认可访问外部函数)
extern void RectArea();
声明外部全局变量(一般在非main.cpp中),extern不可省略,不能初始化。
extern double length, width;
extern double totalArea;

#include<iostream>
using namespace std;
//使用外部函数,需先声明再使用
//此两行代码,可以放到头文件area.h中,在本文件添加#include "area.h"
void RectArea();//声明函数,供main调用
double CircleArea(double r); double length, width;//全局变量,可被其他文件识别
double totalArea = ;//全局变量 int main() {//主函数,被调函数定义在主调函数之前,声明省略
double r1, r2; cout << "请输入长方形的长、宽(m)" << endl;
cin >> length >> width;
cout << "请输入清水池和污水池的半径(m)" << endl;
cin >> r1 >> r2; RectArea();
totalArea += CircleArea(r1);
totalArea += CircleArea(r2); cout << "工程总面积为" << totalArea << "平方米" << endl;
return ;
}
//外部变量,先声明,再使用
//此两行可以放到头文件main.h中,在本文件中添加 #include "main.h"
extern double length, width;//声明外部全局变量,存储main函数中的值
extern double totalArea;
void RectArea() {//函数,长方形面积
double area = length*width;
totalArea += area;
}
double CircleArea(double r) {//函数,圆面积
return( * 3.14*r);
}
源程序文件中的函数、全局变量,默认都可被其他文件访问(需声明)。
若只供文件内使用,可定义成静态static,即静态函数、静态全局变量。(其他文件,即便声明,也无法使用)
静态变量,存储在静态存储区,立即分配内存,调用后存储最新的值,全部程序执行结束,才被释放。
非静态变量,存储在动态存储区(栈),被调用时分配内存,调用结束立即释放,不存储最新值。
非静态变量,不断重复“分配内存/释放”操作,每次重新开始。
#include<iostream>
using namespace std; void fun() {
int x = ;//每次调用执行“分配内存/释放”操作,不存储最新值,每次重新开始
static int y = ;//存储最新值,全部程序结束才释放
x++; y++;
cout << x << " " << y << endl;
}
int main() {
fun();//1 1
fun();//1 2
return ;
}
若声明过多,可以使用头文件,避免繁琐。

//main.h
extern double length, width;//声明外部全局变量,存储main函数中的值
extern double totalArea;
//area.h
void RectArea();//声明函数,供main调用
double CircleArea(double r);
#include<iostream>
#include "area.h"//引入头文件,使得本文件可访问规定的函数文件
using namespace std; double length, width;//全局变量,可被其他文件识别
double totalArea = ;//全局变量 int main() {//主函数,被调函数定义在主调函数之前,声明省略
double r1, r2; cout << "请输入长方形的长、宽(m)" << endl;
cin >> length >> width;
cout << "请输入清水池和污水池的半径(m)" << endl;
cin >> r1 >> r2; RectArea();
totalArea += CircleArea(r1);
totalArea += CircleArea(r2); cout << "工程总面积为" << totalArea << "平方米" << endl;
return ;
}
#include "main.h"//引入头文件,使得本文件可访问规定的变量
void RectArea() {//函数,长方形面积
double area = length*width;
totalArea += area;
}
double CircleArea(double r) {//函数,圆面积
return( * 3.14*r);
}
多文件协作,extern、static、头文件的更多相关文章
- extern与头文件(*.h)的区别和联系
原文网址为:http://lpy999.blog.163.com/blog/static/117372061201182051413310/ 个人认为有一些道理:所以转过来学习了. 用#include ...
- [转]extern与头文件(*.h)的区别和联系
用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字? 如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include<xxx.h> (xxx. ...
- .c和.h文件的区别(头文件与之实现文件的的关系~ )
.c和.h文件的区别 一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢 ...
- 利用 Symbol Type Viewer 工具实现将 pdb 文件 转换为 c\c++ 头文件
利用 Symbol Type Viewer 工具实现将 pdb 文件 转换为 c\c++ 头文件 一.得到符号 二.将符号转换为 .h 文件 三.得到 c\c++ 头文件,之后编程时直接导入这个文件即 ...
- linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)
原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...
- C++ 多文件编译简述:头文件、链接性、声明与定义
目录 Commen Sense 头文件 链接性 static 与链接性控制 extern 与外部链接性 Reference Commen Sense C++ 在编译时对每个翻译单元(Translati ...
- 一个简单的wed服务器SHTTPD(9)————main函数文件,Makefile,头文件
主函数: #include "lcw_shttpd.h" //初始化时服务器的默认配置 extern struct conf_opts conf_para= { "/us ...
- C/C++不同文件夹下包含头文件的方法及#include的使用
转自:http://blog.sina.com.cn/s/blog_6e0693f70100so42.html 本文主要介绍了如何不同文件夹下使用预处理器指示符#include. 假设我们有如下一个工 ...
- 文件类型分类:头文件dirent.h中定义的文件类型与linux内文件符号对应关系
头文件 dirent.h 定义了文件类型: enum{ DT_UNKNOWN = 0, //未知类型 DT_FIFO = 1, //first in, ...
- 删除moduleCache下文件解决预编译头文件相关的编译错误
之前有在代码全部正确的情况下,遇到过下面的编译错误: fatal error: file '.....h' has been modified since the precompiled header ...
随机推荐
- tornado web框架简介
https://www.cnblogs.com/aylin/p/5702994.html
- Ibatis中的<trim>标签应用
<trim>的主要属性如下显示: <trim prefix="" prefixOverrides="" suffix="" ...
- Spring Boot 构建电商基础秒杀项目 (十一) 秒杀
SpringBoot构建电商基础秒杀项目 学习笔记 新建表 create table if not exists promo ( id int not null auto_increment, pro ...
- 进程间通讯:有名管道FIFO
接收端: #include <sys/stat.h> #include <sys/types.h> #include <stdio.h> #include < ...
- .net core 2.0 Autofac
参考自 https://github.com/VictorTzeng/Zxw.Framework.NetCore 安装Autofac,在`project.csproj`加入 <PackageRe ...
- php 编译常见错误
1.configure: error: No curses/termcap library found 网上有的说法是:–with-named-curses-libs=/usr/lib/libncur ...
- 洛谷3704 [SDOI2017] 数字表格 【莫比乌斯反演】
题目分析: 比较有意思,但是套路的数学题. 题目要求$ \prod_{i=1}^{n} \prod_{j=1}^{m}Fib(gcd(i,j)) $. 注意到$ gcd(i,j) $有大量重复,采用莫 ...
- WIN8.1下Prolific USB-to-Serial Comm Port驱动黄色感叹号问题
文章解决来源:http://blog.csdn.net/gsj0791/article/details/17664861 在做fpga口的uart回环测试时候,由于开发板上的是usb转uart,所以需 ...
- bzoj 1103 : [POI2007]大都市meg (树链剖分+线段树)
Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n ...
- wstngfw IKEv2服务器配置示例
wstngfw IKEv2服务器配置示例 移动客户端的服务器配置有几个组件: 为***创建一个证书结构 配置IPsec移动客户端设置 为客户端连接创建阶段1和阶段2 添加IPsec防火墙规则 创建** ...