多文件协作,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 ...
随机推荐
- vscode git设置远程仓库码云
https://www.cnblogs.com/klsw/p/9080041.html
- MVP, MVC, MVVM, 傻傻分不清楚~
1 简介 英文原文:MVC vs. MVP vs. MVVM 三者的目的都是分离关注,使得UI更容易变换(从Winform变为Webform),使得UI更容易进行单元测试. 2 MVC/MVP 2.1 ...
- josn的格式化
public String formatJson(Object obj) { com.alibaba.fastjson.JSONObject json=(com.alibaba.fastjson.JS ...
- 12.k8s的存储卷创建过程
数据持久化需要数据卷.kubernetes生态提供海量的存储驱动和存储使用方式. [root@master song]# cat pod-demo.yml apiVersion: v1 kind: P ...
- BizTalk Server 如何处理大消息
什么是大消息? 遗憾的是,此问题的答案不而直接与特定的消息大小,绑定,取决于你的 Microsoft 的特定瓶颈 BizTalk Server 系统. 与大消息关联的问题可分为以下几类: 内存不足错误 ...
- MySQL的my.cnf文件(解决5.7.18下没有my-default.cnf)
官网说:从5.7.18开始不在二进制包中提供my-default.cnf文件.参考:https://dev.mysql.com/doc/refman/5.7/en/binary-installatio ...
- Python测试Post请求
原有: #coding:utf-8 import requests def request(title, content): datas = {"title":title,&quo ...
- Number Sequence POJ - 1019 递推 数学
题意 1 12 123 1234 12345 ....这样的序列 问第n位数字是几 是数字! 1-9! 思路:递推关系 主要是位数的计算 用a[i]=a[i-1]+(int)log10((do ...
- Nowcoder | [题解-N189]牛客OI赛制测试赛3
这场说实话确实水(逃*1),表示差一点就AK了(逃*2),然而被卡两个特判的我\(ssfd\)...\(qwq\) 表示这是第一次发整场比赛的题解...还请各位大佬原谅我太蒻写的垃圾啊\(qwq\). ...
- SAM练习记录
SAM练习记录 洛谷 P1368 工艺 其实是最小表示法裸题 倍长后建SAM跑最小的边走|S|步即可 Code CF 235 C. Cyclical Quest 对主串建SAM 然后每个串倍长,跑的时 ...