运行文件的小技巧:包含2个.CPP和一个.H文件,必须一个.CPP一个.H一一对应。且C++中,只能运行一个项目,要想在多个文件中(.cpp)运行一个.cpp必须建立多个项目,或者将不允许运行的文件从该项目中剔除掉,注意不是删除。
        每一个c++项目中可以包含多个cpp文件和.h文件,不过只能有而且必须有一个cpp文件中包含main函数,否则就会报错。所以在一个c++项目中不能单独运行一个cpp文件,只能运行一个项目。如果你想一个一个的运行cpp文件,请建立多个项目,或者在项目中排除上一个包含main函数的文件(在vc6.0和vs2008/vs2010中的方法是右击文件——在项目中排除,这个操作不会删除文件,只是从当前项目中排除该文件。),添加下一个包含main函数的文件。 
        记住即可。对于其他文件中的全局变量,可能需要加extern ?
以下是别人的解答部分:
授人以鱼,不如授人以渔.建议楼主好好看看<<C++ primer>>这本书,目前有中文第四版,我非常喜欢它,我也是去年十月份开始学习C++的,看完它再看<<effective C++>>和<<more effective C++>> , 尤其是<<effective C++>>,简直是C++的圣经,非看不可...最后到高级了.你还可以看看<<深入探索C++对象模型>>...我全看完了,感觉受益匪浅.
        解答问题之前,复习一下基本概念;
1:C++中的全局变量,在整个程序中只能定义一次,但可以声明多次(不限次数); 在一个地方定义,,然后在其他地方使用时,要先声明一下;
2:什么叫变量定义? 比如 int i; 这就是定义;
而 extern int i; 则 只是声明;
但如果写作 extern int i = 0; 则这也是定义,不是声明;(是不是有点绕??熟悉了就很简单了)
所以,我觉得你的问题.实际上是源自你对C++语法中变量的定义和声明这两个概念的模糊;
你说你在a.cpp 中声明 i, 而在b.cpp中必须用extern 声明才可通过编译,这是正常的..因为你的i是在a.cpp中定义的..
你说你在b.cpp中声明i, a.cpp中是否使用extern都可以通过编译,这个问题嘛.我估计你的代码实际上仍然是在a.cpp中定义了i,而b.cpp中定义的i不是全局的.
至于你说如果有多个源文件.那么编译顺序如何确定.这个问题很难回答你,恐怕不同的编译器对此的处理都不大相同..我觉得你不应该考虑这个问题..实际上编译器会把不同的源文件分别、单独地编译成独立的模块,最后再链接成一个可执行程序,因为它们都是独立编译的模块,理论上说.编译顺序是不重要的.
我觉得倒是应该告诉你如何正确地管理和使用全局变量;
首先,建立一个 "global.h"(文件名随你,我这里举个例子而已,记得在头文件里加上头文件保护符哦!如果你告诉我你不知道什么是头文件保护符,我强烈建议你不要再往下看了..立刻去买一本C++primer吧);
在global.h文件中.声明你所需要的所有全局变量,以下是 global.h的内容:
#ifndefGLOBAL_H
#define GLOBAL_H
extern int g_i; // 此处是声明,另外,在全局变量前加一个 g_ 是好习惯.
#endif
然后新建一个 global.cpp文件,包含 global.h文件,接着,定义所有的全局变量,
以下是global.cpp的内容:
#include "global.h"
int g_i = 1982; // 此处是定义!!!
至此,一切搞定,最后,在你需要用到全局变量的cpp文件中包含 global.h吧...比如你的a.cpp和b.cpp; 编译顺利了吧?
/////////////////////////////////////////////
看到楼主的新问题了..我再补充回答一下.
问题1:我的疑问是,如果在my.cpp中定义了theApp,则必须在mfc.cpp中用extern声明theApp,否则编译出错;但是如果在mfc.cpp中定义theApp,则不必在my.cpp中声明,编译也能够通过,这是为什么呢?
我的回答: 这个问题还是声明和定义的问题.我之前说过了.一个变量(比如你的这个theApp),在整个程序中只能定义一次, 然后在需要使用它的地方,要先声明后使用.
因此,看看实际情况:你在my.cpp中定义了theApp,当你在mfc.cpp中要使用它,当然要先声明它咯,而声明变量必须加上extern,不然就变成定义了,那么就会导致你在my.cpp和mfc.cpp中定义同名全局变量两次,自然就无法通过编译.
而如果你在mfc.cpp中定义theApp的话,因为在my.cpp中没有直接用到 theApp.所以,就不需要声明了.这下清楚了吧?呵呵.
还有,补充一个基础知识,,我们通常写 int i; 这样的语句是"定义","定义"实际上就起到了"声明"的作用; 所以,如果你不是定义变量,而是单纯要声明一个外部的全局变量(也就是其他cpp文件里的全局变量)的时候,是肯定要加extern的.
我觉得楼主是对 与要加extern感到诧异.
问题2:
这个程序我运行的结果是只有构造函数的那些输出语句执行了,而析构函数的那些输出语句并没有执行,这又是为什么呢?
这个讲起来有点多.涉及到一个C++程序的启动过程:我简单地说说,
以windows为例,点击一个exe程序后,系统创建一个"进程内核对象",创建4G虚拟内存空间以及其他的一些执行程序需要的资源,然后创建"线程内核对象",启动一个线程(也就是主线程了),这个线程调用一个 C++ startup函数,该函数会初始化 你的程序中的所有全局变量,( 这个时候你就看到你 theApp的那些基类构造函数的执行,并打印出来),所有全局变量构造好以后,才开始执行你写的main函数.
然后,你的main函数 return了.这时,执行一个C++执行期函数exit(),析构你的所有全局变量(也就是theApp), 但这个时候你的console窗口已经退出了.所以你看不到那些析构函数执行时的打印信息了.呵呵.
另外:我真的非常推荐楼主先好好看看<<C++ primer>>和<<effective C++>>这两本书,不要把<<深入浅出mfc>>当成C++教材来看,虽然这本书很好,并且通过mfc,很好地示范了C++ 继承,虚函数的妙用.但是,<深入浅出mfc>的作者侯捷说的好:勿于浮沙筑高台.. 基础打牢非常关键. 当你把C++的基础知识搞清以后,再看深入浅出 mfc 其实是很简单的..

简单点就是说,.H文件是连接多个.cpp的桥梁或者纽带。当然对于多个.cpp文件,想要用同一个变量,需要用到extern来声明。
注意区别声明与定义。

注意:

何为声明,何为定义,一定要区别开来。那我们该如何管理这个全局变量呢,包括一些个方法。其实从本质上来讲,这个和类都一样,类也有声明与定义的区别。

比如,我们一般在.h文件中进行变量(实例变量)和方法(函数的声明),然后再.C文件中实现(包括定义 ,主要是定义),但不一定是初始化。其实,定义我觉得会有一个默认的初始值。

我们一般的做法是:定义一个globle的.h文件与.cpp文件,然后将声明全部写到.h文件中去。将实现或者说是定义写到.cpp文件中去。

示例如下:

注意在globle.h文件中要加上  #ifndef GLOBLE_H #define GLOBLE_H                xxxxxxx          #endif

#ifndef GLOBLE_H
#define GLOBLE_H
#include<iostream>
#include"tinyxml.h"
#include<string>
#include<sstream>
#include<math.h>
#include<fstream>//文件操作
#include<Windows.h>
#include<ctime>
#include<winsock.h>
#include<math.h>
#include"comm.cpp"
#include"rasterization.h"
using namespace std; extern double car_length;
extern const UINT SLEEP_TIME_INTERVAL; //当串口无数据时,sleep至下次查询间隔的时间,单位:毫秒
extern int realnum;
extern int lastnum; extern _sync_com hCom;
extern HANDLE hThreadEvent; //时间线程句柄
extern SYSTEMTIME sysTime; //系统当前时间
extern string dataFile; //数据文件名
extern int infoIndex;
extern ofstream ocout;
extern stringstream dataStream;
extern int in;
extern int file_length; extern double lon,lat;//经度、纬度
extern double dv,bv,tv;//东向、北向、天向速度
extern short speed;//速度:单位cm/s //extern coordinate COORDINATE;
//extern point1 POINT1;
没有这种写法, 这是完全错误的,这是啥,声明套声明吗? 我们直接定义变量即可。还有就是下面的是声明,所谓extern 它就是为了声明一些个变量而存在的,至于
结构体这种自定义类型的变量,声明用typedef更好些,不过用extern是完全可以的,可以到网上看看。但是我们在.h中声明了,就不要在去.cpp中声明了,重复工作,不足取。
//extern line LINE;
//extern roadnet ROADNET;
//extern trackpoint TRACKPOINT;
typedef struct coordinate
{
}COORDINATE; typedef struct point1
{ }POINT1; //普通线
typedef struct line
{ }LINE;
//路网
typedef struct roadnet
{

}ROADNET; //路点对象,代表kml里Point类型的Placemark
typedef struct trackpoint
{ }TRACKPOINT; extern bool matchFalse;
extern ROADNET* roadnet;
extern TRACKPOINT **trackpoints;
extern int trackpointsnumber;
extern double azimuth;
double distBetweenPoints(double latA, double lonA, double latB, double lonB);
#endif

globle.cpp 当中文件

#include"globle.h"
double car_length=;
const UINT SLEEP_TIME_INTERVAL = ; //当串口无数据时,sleep至下次查询间隔的时间,单位:毫秒
int realnum = ;
int lastnum=-; _sync_com hCom;
HANDLE hThreadEvent; //时间线程句柄
SYSTEMTIME sysTime; //系统当前时间
string dataFile = ""; //数据文件名
int infoIndex = ;
ofstream ocout;
stringstream dataStream;
int in = ;
int file_length; double lon,lat;//经度、纬度
double dv,bv,tv;//东向、北向、天向速度
short speed;//速度:单位cm/s
bool matchFalse = false;
ROADNET* roadnet = NULL;
TRACKPOINT **trackpoints;
int trackpointsnumber = ;
double azimuth = -3.1415926/;
/*
* 计算两个经纬度坐标之间的距离,公式为:
* MLatA A的纬度,MLonA A的经度,MlatB B的纬度,MlonB B的经度
* C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB)
* Distance = R*Arccos(C)*Pi/180
* @param latA A点纬度
* @param lonA A点经度
* @param latB B点纬度
* @param lonB B点经度
* return 返回距离值
*/
double distBetweenPoints(double latA, double lonA, double latB, double lonB)
{
if (latA==latB && lonA == lonB) return ;
//定义pi
const double PI = 3.1415926535897932384626433832795;
//定义地球半径,单位为米
const double R = ;
//公式
double C = sin(latA) * sin(latB) * cos(lonA - lonB) + cos(latA) * cos(latB);
double distance = R * acos(C) * PI / ;
return distance;
}

C++中全局变量如何使用的更多相关文章

  1. python中全局变量和局部变量的一个小坑

    python 中全局变量和局部变量在使用过程中的一个容易出错的地方 什么是全局变量 python中,在函数外部声明的变量可以叫做全局变量. x = 10 def fn1(): pass fn1() 什 ...

  2. ajax实现给JavaScript中全局变量赋值(转)

    原文地址:ajax实现给JavaScript中全局变量赋值 问题简化: <script type="text/javascript"> var a=1 ; functi ...

  3. PHP中全局变量global和$GLOBALS[]的区别分析

    $GLOBALS['var']是外部的全局变量本身,global $var是外部$var的同名引用或者指针     一.举例比较 例一: 复制代码 代码如下: <?php $var1 = 1; ...

  4. PHP和JS中全局变量和局部变量

    一,PHP中全局变量和局部变量 php与C++中对全局变量和局部变量定义类似,全局变量:函数外定义的变量,在全局通用:局部变量:在函数内定义的变量,只在函数内有效.PHP中变量范围跨越了include ...

  5. Python 中全局变量的实现

    一.概述 Python 中全局变量的使用场景不多,但偶尔也有用武之处. 如在函数中的初始化,有时需要从外部传入一个全局变量加以控制.或者在函数中,使用连接池时,也可能有使用全局变量的需要. 广义上的全 ...

  6. VUE中全局变量的定义和使用

    目录 VUE中全局变量的定义和使用 1.工作中遇到的两类问题 1.1 状态值(标志) 1.2 传递字段 2.解决方法 2.1 VUEX 2.2 使用全局变量法管理状态与字段值 3.具体实现 3.1创建 ...

  7. php中全局变量global和超全局变量$GLOBALS

    php中全局变量global和超全局变量$GLOBALS 1.global Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require ...

  8. js中全局变量和局部变量以及变量声明提升

    javascript中全局变量和局部变量的区别 转载前端小99 发布于2018-04-23 15:31:35 阅读数 2102  收藏 展开 [javascript] view plain copy ...

  9. kettle中全局变量的设置

    设置全局变量. 找到.properties文件: 在文件中设置值: 在kettle中新建一个job(不用做任何设置): 转换中获取便元的设置: 重启kettle的执行结果:

  10. nodejs中全局变量

    1.global 类似于客户端javascript运行环境中的window module1.js: module.exports={}; //耻辱的使用了全局变量 global.varA = &quo ...

随机推荐

  1. [SPOJ839]Optimal Marks

    [SPOJ839]Optimal Marks 试题描述 You are given an undirected graph \(G(V, E)\). Each vertex has a mark wh ...

  2. BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】

    题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...

  3. php合并图片

    <?php class image{ /** * @param string $backgroundImage 背景图 * @param string $smallImage 小图 * @par ...

  4. shell for 循环实践

    for循环语法结构如下 [root@backup tmp]# .sh #!/bin/bash ` do echo $i done [root@backup tmp]# .sh 3 批量修改文件名 [r ...

  5. Lis(bzoj 3532)

    Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案.    如果有多种方案,请输出 ...

  6. 贪吃蛇(bzoj 4213)

    Description  最近lwher迷上了贪吃蛇游戏,在玩了几天却从未占满全地图的情况下,他不得不承认自己是一个弱菜,只能改去开发一款更弱的贪吃蛇游戏. 在开发的过程中,lwher脑洞大开,搞了一 ...

  7. FOR XML PATH 语句的应用【所有列值显示在一行中】

    原文发布时间为:2010-10-20 -- 来源于本人的百度文章 [由搬家工具导入] 大家都知道在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据,下面是它的一 ...

  8. 模仿原生淘宝app点击搜索时的页面滑动效果

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  9. PMI8940 PON (power on) trigger

    PMI8940 唯一的 PON input pin 是 SHDN_N, PM8937 的 VREG_L5 會接到 PMI8940 的 SHDN_N, PM8937 負責整個系統的 power on s ...

  10. Scrapy笔记:使用代理ip

    scrapy框架使用代理ip的基本思路是修改请求对象中的meta['proxy']的值,将代理ip赋值给这个属性.遵循这个思路,只要是生成Request对象的地方都可以设置Request的值. dow ...