全域性變數宣告的規範化

2021-09-06 16:52:11 字數 1542 閱讀 7847

lua將環境本身儲存在乙個全域性變數_g中,(_g._g等於_g)。

為了對全域性命名空間更好的管理,最好是顯示的宣告每乙個變數,可以通過使用metamethod來改變_g的行為來進行規範:

--

宣告新的變數,使用rawset繞過metamethod的限制--

保證宣告的變數不為nil,如果宣告乙個nil變數,等於該變數還是不存在,訪問該變數的時候還是會觸發__indexdeclare = function

(name, initval)

rawset(_g, name, initval or

false

)end

--改變全域性變數的訪問行為

setmetatable(_g

,

)declare("a

")a = 1

print(a) --

1a = nil

print(a) --

error 觸發__index,因為該變數已經釋放了

上述**中,每乙個變數都需要顯示declare,並且不能宣告nil變數。

下面這種方法可以宣告nil變數,但需要用乙個表來顯示的記錄每乙個宣告過的變數:

local declarenames ={}

function

declare(name, initval)

rawset(_g

, name, initval)

declarenames[name] = true

endsetmetatable(_g

,

)declare("a

")a = 1

print(a) --

1a = nil

print(a) --

nil 還是可以訪問

個人偏向於第一種方法,因為第二種方法中,當乙個變數被置為nil以後,實際上該變數已經被釋放了,所以將變數的置空操作封裝在乙個undeclear函式中。對第二種方法的改進:

local declarenames ={}

function

declare(name, initval)

rawset(_g

, name, initval)

declarenames[name] = true

endfunction

undeclare(name)

declarenames[name] = nil

rawset(_g, name, nil

)end

setmetatable(_g

,

)declare("a

")a = 1

print(a) --

1undeclare("a"

)print(a) --

error 變數已經不存在了,會觸發__index

兩種方法的代價都很小,可以忽略不計,但是給整個程式設計環境帶來的好處是不言而喻的。

全域性變數宣告

首先在.h標頭檔案中宣告全域性變數,用extern宣告,宣告時不能賦值。pragma once ifndef beijing h define beijing h include include include opencv2 core core.hpp extern std vectorug ex...

全域性變數的定義宣告

c 中定義全域性變數要注意的地方 yandaren 1220 chinaunix部落格 c 中定義全域性變數要注意的地方 在c 中定義全域性變數是應該盡量在.cpp檔案中定義,而不要在.h 檔案中 定義,定義好了之後,可以在.件中利用 extern關鍵字進行 宣告.如果在.件中定義的話,多層包含可能...

uC OS II中的全域性變數宣告

在uc os ii的 中,應用了一種讓人耳目一新的全域性變數定義方法。在 uc os ii 中,作者給出了解釋,但是這裡還是忍不住要討論一番。我們知道,全域性變數的使用有兩個問題 1.要給它分配記憶體,並且只能分配一次。2.在其它模組中也要能通過extern關鍵字呼叫。軟體開發網 按照平時的定義,如...