久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4586|回復: 0
收起左側

在頭文件中使用static定義變量意味著什么

[復制鏈接]
ID:105323 發表于 2016-2-12 20:59 | 顯示全部樓層 |閱讀模式
看到有一位同學在頭文件中這么寫:


1static const wchar_t*g_str1 = …

2static const wchar_t*g_str2 = …



這種定義變量的方式我從來沒有見過,而且它還能順利通過編譯,于是我很想知道編譯器是如何處理這種變量定義的。
定義全局變量時使用static,意味著該變量的作用域只限于定義它的源文件中,其它源文件不能訪問。既然這種定義方式出現在頭文件中,那么可以很自然地推測:包含了該頭文件的所有源文件中都定義了這些變量,即該頭文件被包含了多少次,這些變量就定義了多少次。
假如將上面兩行代碼的static去掉,編譯的時候就會出現變量重定義的錯誤,這進一步證實了上面的推測,因為沒有static的話變量的作用域是全局的,定義了兩個以上的同名變量就會出現該錯誤。
推測終究是推測,要真正證實這個推測還要通過寫代碼來驗證。驗證的方式是:在頭文件中使用static定義變量,在多個源文件中包含該頭文件,然后在每個源文件中輸出變量的地址,同時在一個源文件中改變變量的值并輸出,在另一個源文件中也輸出。如果每個源文件的輸出都不同,則推測得證;否則推測是錯誤的。
下面是定義變量的頭文件的代碼:


1//Header.h

2#pragma once

3

4static int g_int= 3;



接下來在另一個頭文件中聲明兩個測試函數:


1//Functions.h

2#pragma once

3

4void TestSource1();

5void TestSource2();



分別在兩個源文件中定義這兩個測試函數:


01//Source1.cpp

02#include<stdio.h>

03#include "Header.h"

04

05void TestSource1() {

06

07wprintf(L"g_int's address in Source1.cpp:x\n",&g_int);

08g_int = 5;

09wprintf(L"g_int's value in Source1.cpp:%d\n", g_int);

10}




1//Source2.cpp

2#include<stdio.h>

3#include "Header.h"

4

5void TestSource2() {

6

7wprintf(L"g_int's address in Source2.cpp:x\n",&g_int);

8wprintf(L"g_int's value in Source2.cpp:%d\n", g_int);

9}



最后在main函數中調用這兩個測試函數:


1//Main.cpp

2#include "Functions.h"

3

4int wmain() {

5

6TestSource1();

7TestSource2();

8}



運行該程序:


可以看到,雖然在代碼中好像使用了相同的變量,但是實際上使用的是不同的變量,在每個源文件中都有單獨的變量。所以,在頭文件中定義static變量會造成變量多次定義,造成內存空間的浪費,而且也不是真正的全局變量。應該避免使用這種定義方式。
作為對比,下面使用正確的方式來定義全局變量:

1//Header.h

2#pragma once

3

4extern int g_int;





01//Source1.cpp

02#include<stdio.h>

03#include "Header.h"

04

05int g_int= 3;

06

07void TestSource1() {

08

09wprintf(L"g_int's address in Source1.cpp:x\n",&g_int);

10g_int = 5;

11wprintf(L"g_int's value in Source1.cpp:%d\n", g_int);

12}



其它文件不變。
運行程序:


可以看到,這次兩個源文件中使用的都是同一個變量。要注意的是,使用extern聲明變量時不能帶有初始值,否則仍然屬于變量定義,會出現變量重定義的錯誤。

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品一区二区三区 | 欧美日韩视频在线 | 久久久久久99 | 国产 91 视频 | 精品香蕉一区二区三区 | 久久一二三区 | 日韩电影一区二区三区 | 一区二区三区中文字幕 | 伊人艹| 91精品国产综合久久久密闭 | 国产日韩精品一区 | 性高湖久久久久久久久3小时 | 羞羞在线观看视频 | 91精品国产日韩91久久久久久 | 久久久久久91 | 午夜在线| 精品久久久久香蕉网 | 久久久久国产精品 | 日韩欧美久久精品 | 久久久久国色av免费观看性色 | 91九色视频| 91福利在线观看视频 | 成人av一区| 成年人免费在线视频 | 一级毛片视频 | 精品国产色 | 国产成人高清在线观看 | 福利一区二区 | 久久国 | 欧美在线视频不卡 | 九色一区 | 一级毛片播放 | 久久99久久99精品免视看婷婷 | 久久中文字幕一区 | 在线中文字幕日韩 | 色视频网站 | 亚洲激情综合网 | www日本高清 | 日韩精品一区二区三区在线 | 欧美日韩国产精品一区 | 人妖一区 |