c++中的全局變量
1.可以定義的位置
main函數所在文件的函數體外
其它cpp文件的函數體外
不能放在h文件中,因為h文件可能會有多次引用,會爆重復定義
2.引用方式,c++裡面
通過extern 加變量的定義語句的方式 這樣所有引用的這個變量只會是一個值
c中的全局變量
1.可以定義的位置
main函數所在文件的函數體外
其它cpp文件的函數體外
不能放在h文件中,因為h文件可能會有多次引用,會爆重復定義
---------------------------------------------------------
為什麼可以這樣使用?
編譯分為編譯和鏈接過程。
每個c,cpp對應一個文件,雖然在外面是不能看見,但是如果使用了extern的話,鏈接器會將同一名字的變量鏈接到一個地址,大約是在文件的某個段裡面。
因為c++的語法要求更嚴格,所以要求extern的變量和原變量必須有相同的聲明,而c其實就是匯編語言沒什麼區別,更在乎的是變量的長度,對應類型沒有做更多的檢查。
---------------------------------------------------------
附錄:
c++代碼
--------------
main.h
#ifndef _MAIN_H_
#define _MAIN_H_
int g_value = 10;
class b
{
public:
int _value;
void good();
};
#endif
main.cpp
#include "main.h"
#include <iostream>
void b::good()
{
//std::cout<<g_value<<std::endl;
}
good.cpp
#include <iostream>
#include "main.h"
using namespace std;
extern int g_value;
//int g_value;
int main()
{
b obj_b;
cout<<"old g_value:"<<g_value<<endl;
obj_b.good();
g_value = 0x10;
cout<<"new g_value:"<<g_value<<endl;
obj_b.good();
system("pause");
}
-------------------------------------------------------------------
c代碼
main.h
#ifndef _MAIN_H_
#define _MAIN_H_
void good();
#endif
main.c
#include "main.h"
#include <stdio.h>
int g_value = 10;
void good()
{
printf("main.c print %d\n", g_value);
}
good.c
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
extern char g_value;
//extern int g_value; 注意類型不一樣在c裡面是不會爆編譯錯誤的
//int g_value;
int main()
{
printf("old value:%d\n", g_value);
g_value =0x10;
printf("new value:%d\n", g_value);
system("pause");
}
摘自 RunBoying