我只是需要一種方法來限制C語言而不是C 語言中每個函式對一個全域變數的訪問
static int global_int = 10;
int main(void)
{
global_int = 20; // allowed
}
void f()
{
global_int = 30; // global_int不能在此使用。
}
我的意思是,在一個翻譯單元中有更多的函式,我需要阻止一些函式訪問全域變數,而允許其他一些函式;而不是在每個函式中定義這個變數,使用這個變數。
uj5u.com熱心網友回復:
你試圖做的事情是不可能的。 相反,將那些允許訪問靜態全域變數的函式定義為一個單獨的翻譯單元,并將所有其他函式定義在其他翻譯單元中。
因此,將f移到一個單獨的檔案中,并將main放在與 global 定義相同的地方。
在C語言中還有其他隱藏資訊的方法,但在所有情況下,這只是你為自己建立的一個慣例,而且你應該知道自己在做什么(這就是C語言的哲學)。
uj5u.com熱心網友回復:
"static"(內部鏈接)和 "global"(外部鏈接)是相互排斥的。你不能有一個 "靜態全域"。然而,你可以在檔案范圍宣告靜態變數,也就是在任何函式體之外。這樣的變數就可以獲得內部鏈接和靜態存盤時間。
在檔案范圍內宣告的靜態變數可以被駐留在同一個翻譯單元中的每個函式訪問。簡單地說:與該變數存在于同一.c檔案中的任何函式。
因此,正確的解決方案是將main放在與該變數相同的.c檔案中,而將函式f放在不同的.c檔案中。
舉個例子。假設你正在設計一個名為 "stuff "的模塊。stuff.h是你的公共介面,stuff.c可能包含頭檔案中一些函式的私有實作,另一個檔案stuff_internal.c可能包含其他函式定義。stuff.c和stuff_internal.c都包括stuff.h,但static檔案范圍變數和所有使用它的函式都放在stuff_internal.c中。
關于以執行緒安全的方式用一個物件的多個實體實作私有封裝的更多高級方法,請參見如何在C語言中進行私有封裝?
。uj5u.com熱心網友回復:
static和extern是獨立的限定詞。static只在檔案的范圍內可見。你可以在不同的檔案中定義main()和f()。你可以在兩個檔案中都將 global_int 定義為靜態變數,它們對編譯器來說將是獨立的變數。
靜態變數在資料段分配記憶體,而不是堆疊段。如果你想讓變數在所有的檔案中都是可見的,請將它們宣告為extern。
uj5u.com熱心網友回復:
這個問題是不良設計的一個癥狀,正確的方法在其他答案中有所描述。然而,如果你的選擇是有限的,你可以使用下面的黑客技術。
這個問題可以通過預處理程式來解決。
只需添加一個global_int宏,它可以擴展到自己。
#define global_int global_int
不會有遞回,因為擴展的宏總是在應用時被禁用。
當進入 "禁區 "時,只需取消對這個宏的定義。可以選擇用其他東西來代替它,如global_int__guard以獲得更好的診斷。當離開禁區時,再把它替換回來。
#undef global_int
#define global_int global_int__guard。
...不能訪問`global_int`的代碼
#undef global_int
#define global_int global_int
任何對global_int的訪問都會導致global_int__guard未宣告的編譯錯誤。
你可以使用push/pop macro pragmas,如果你的編譯器支持它,使這個程序更方便。
uj5u.com熱心網友回復:
你的選擇包括:
你的選擇包括:
你的選擇包括
void f(void)
{
// global_int在這里是不可見的。 {
}
static int global_int = 10;
int main(void)
{
global_int = 20;
}
- 如果變數只在一個函式中使用,則只在該函式中宣告:
int main(void)
{
static int global_int = 10;
global_int = 20;
}
void f(void)
{
// global_int在這里是不可見的。 {
}
- 像tstanisl的答案那樣使用宏來掩蓋某些地方的名稱。
- 在各翻譯單元中,根據它們應該看到的變數來分割你的函式。
- 通過在新的作用域中以不兼容的方式宣告相同的名稱來隱藏變數: 。
static int global_int = 10;
void f(void)
{
typedef struct foo global_int; /span>
...
global_int = 20; //得到一個錯誤,因為 global_int 是一個型別,不是一個變數。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/334261.html
標籤:
