找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 9404|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

多個(gè)c文件共享同一個(gè)變量(全局變量)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:105323 發(fā)表于 2016-3-4 01:23 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
記得還是大二的時(shí)候,只會(huì)if else這些,所有的代碼都是在同一個(gè)main.c文件中!。∵@是何等的搞笑啊,現(xiàn)在想想都覺(jué)得好笑,不過(guò)很開(kāi)心我現(xiàn)在終于會(huì)把自己寫(xiě)的東西保存起來(lái),因?yàn)闆](méi)準(zhǔn)哪天會(huì)用到,畢竟自己寫(xiě)的,自己知道怎么去改,既然當(dāng)了程序員,那么就要將基礎(chǔ)學(xué)好咯,以上都是廢話(huà)。
This isa 華麗的分割線(xiàn)----------------
多個(gè)源文件共享同個(gè)變量的方法當(dāng)然就是extern關(guān)鍵字了
extern:extern可置于變量或者函數(shù)前,以表示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時(shí)在其他模塊中尋找其定義。另外,extern也可用來(lái)進(jìn)行鏈接指定。
現(xiàn)做如下解釋?zhuān)?/font>
我們可以在一個(gè)變量前加一個(gè)extern比如:extern unsigned int Test;
那么加上這句話(huà)之后,編譯器編譯的時(shí)候(別問(wèn)我編譯是什么意思)會(huì)把Test當(dāng)成是外部的!會(huì)在其他地方尋找Test這個(gè)變量的定義,如果你只加了個(gè)extern那么編譯器就會(huì)報(bào)錯(cuò)滴!比如這樣:
1>main.obj: error LNK2001: 無(wú)法解析的外部符號(hào) "int Test"(?Test@@3HA)
1>E:\wtl\test\test\Debug\test.exe : fatalerror LNK1120: 1 個(gè)無(wú)法解析的外部命令
那么就說(shuō)明,其實(shí)我們這個(gè)extern關(guān)鍵字只是說(shuō)明我們從外部引用了一個(gè)變量,該變量的值叫Test,提醒編譯器要到其他文件中查找該變量!
要想不報(bào)錯(cuò),在其他文件加個(gè)int Test定義一個(gè)名字叫Test的變量吧。這樣就能編譯通過(guò)啦,貌似有點(diǎn)離題。表緊!我們趕緊回頭,
那么假設(shè)我有個(gè)main.c,source1.c,source2.c那么我想要在main里面定義一個(gè)變量,在source1.c跟source2.c都能使用該如何做?很簡(jiǎn)單,先在main.c中定義一個(gè)值:int data;
那么在兩個(gè)點(diǎn)c文件中都加上:externintdata,那么,恭喜你,這個(gè)變量能被這三個(gè).c文件共用了,相當(dāng)于一個(gè)全局變量了吧。
示例代碼:
Main.c
#include
#include "source1.h"
#include "source2.h"
intdata;
using namespace std;
void main()
{
data = 4;
adddata2();
cout<<data<<endl;
adddata1();
cout<<data<<endl;
cout<<"hello world "<<endl;
}
Source1.c
#include "source2.h"
using namespace std;
extern int data;
void adddata2()
{
data = data + 10;
}
Source.h
#ifndef __SOURCE1_H__
#define __SOURCE1_H__
#include
void adddata1();
#endif
Source2.c
#include "source1.h"
using namespace std;
extern int data;
void adddata1()
{
data = data + 100;
}
Source2.h
#ifndef __SOURCE2_H__
#define __SOURCE2_H__
#include
void adddata2();
#endif


如上是結(jié)果,
大家自己理解哈~~~
goodnight~~~
其實(shí)想想原理挺容易懂的
當(dāng)你聲明一個(gè)變量的時(shí)候是這樣 unsigned int data =0;
當(dāng)你在另一個(gè)源文件中想使用這個(gè)變量的時(shí)候。只需要加關(guān)鍵字:externunsigned intdata;(注意,這只是說(shuō)明這個(gè)data是外部的變量,實(shí)際上并不分配存儲(chǔ)空間的。也就是不能初始化!)這樣就很Ok啦。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表