c++17进阶(2)-Lua扩展(1)
Lua的C API,也就是主機程序可用于與Lua通信的C函數集。所有API函數以及相關的類型和常量都在頭文件lua.h中聲明。
API中的任何功能(函數)都可以作為宏來提供。除非另有說明,所有這樣的宏都只使用它們的每個參數一次(除了第一個參數,它總是一個Lua狀態),因此不會產生任何隱藏的副作用。 但要注意,與大多數C庫一樣,Lua API函數不會檢查其參數的有效性或一致性,可通過使用定義的宏LUA_USE_APICHECK編譯Lua改變這種行為。
Lua庫是完全可重入的:它沒有全局變量。它將需要的所有信息保存在一個動態結構中,稱為Lua狀態。 每個Lua狀態都有一個或多個線程,它們對應于獨立的、協作的執行行。類型lua_State(盡管名稱不同)指的是線程(間接地,通過線程,它也引用與線程相關聯的Lua狀態)。指向線程的指針必須作為第一個參數傳遞給庫中的每個函數,lua_newstate除外,它從頭創建一個Lua狀態,并返回指向處于新狀態的主線程的指針。
當與Lua API交互時,有責任確保一致性,一定妥善控制堆棧溢出。當調用任何API函數時,必須確保堆棧有足夠的空間來容納結果。但是,當你調用一個沒有固定數量結果的Lua函數時(參見lua_call), Lua會確保堆棧有足夠的空間容納所有結果,它不確保任何額外的空間。因此,在這樣一個調用之后將任何東西壓入堆棧之前,應該使用lua_checkstack。
API中接收堆棧索引的任何函數只能使用有效索引或可接受索引。
有效索引是指存儲可修改Lua值的位置的索引。它由1和棧頂之間的堆棧索引(1≤abs(index)≤top)加上偽索引組成,偽索引表示一些C代碼可以訪問但不在棧內的位置。偽索引用于訪問注冊表(見§4.3)和C函數的上值(見§4.2)。
不需要特定的可變位置而只需要一個值的函數(例如,查詢函數)可以使用可接受的索引來調用。一個可接受的索引可以是任何有效索引,但也可以是堆棧頂部之后為堆棧分配的空間內的任何正索引,即堆棧大小之前的索引。(注意,0永遠都不是一個可接受的索引。)向上值的索引(見§4.2)大于當前C函數中向上值的實際數目也是可以接受的(但無效)。除非另有說明,否則API中的函數都使用可接受的索引。
可接受的索引可以避免在查詢堆棧時對堆棧頂部進行額外的測試。例如,一個C函數可以查詢它的第三個參數,而不需要檢查是否有第三個參數,也就是說,不需要檢查3是否是一個有效的索引。
對于可以使用可接受索引調用的函數,任何無效索引都被視為包含虛擬類型LUA_TNONE的值,該值的行為類似于nil值。
總結
以上是生活随笔為你收集整理的c++17进阶(2)-Lua扩展(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring 事务方法与非事务方法相互调
- 下一篇: c++17进阶(3)-Boehm GC垃