我有一個需要共享一段數據的相關函數的文件。儘管我想避免使用全局變量,但我能想到的最佳解決方案是在文件中聲明靜態,但我想將範圍限制爲文件。我認爲這可以通過static
聲明完成。還有其他優越的選擇嗎?替代C中的成員變量
在面向對象的環境中,它們都是類的成員。
我有一個需要共享一段數據的相關函數的文件。儘管我想避免使用全局變量,但我能想到的最佳解決方案是在文件中聲明靜態,但我想將範圍限制爲文件。我認爲這可以通過static
聲明完成。還有其他優越的選擇嗎?替代C中的成員變量
在面向對象的環境中,它們都是類的成員。
不,聲明一個全局靜態變量幾乎涵蓋了你需要做的事情(假設變量需要改變;否則使用一個宏)。您可以在全局級別聲明一個靜態變量,並使其對文件保密。
此外,請注意,這完全不是線程安全的。
static
會限制範圍到當前編譯(文件)。但這是一個全球性的聲明。另一種方法是將函數中的對象作爲參數傳遞給函數。這很常見。
A static
將限制範圍到文件,但只有一個。這意味着如果涉及任何狀態,您只能擁有該組函數的一個用戶。
最好有一個生命週期的句柄,你可以有一個範圍,但是你需要它。即:
Foo * handle = foo_create(); // Allocates and initializes a structure
foo_operation1(handle);
foo_operation2(handle);
foo_destroy(handle); // Deallocates the structure
這保證了只有知道handle
就可以做任何事情,改變它的代碼。
雖然一個靜態工作,我認爲你真正想要的是一個結構。每個函數都將這個結構作爲參數。因此類似於:
typedef struct mystruct_s {
...
} mystruct_t;
void myfunc1(mystruct_t *mystruct);
void myfunc2(mystruct_t *mystruct);
此方法的一個優點是它的線程安全。即,您可以同時運行多個mystruct實例。它也比本質上是一個全局變量更清潔(即使它只限於一個文件)。
這是一個很酷的想法。看起來它需要這些函數的調用者擁有指針的副本,我認爲可以通過調用mystruct_s * get_mystruct_ptr(){return&mystruct_t}來提供指針的副本,或者是否有方法讓調用者不知道需要它? – 2NinerRomeo 2011-05-20 20:27:08
調用者需要指針。他們會在堆棧上創建結構,或者他們可以調用某種'create_mystruct()'來malloc它(請注意,您需要一個相應的'destroy_mystruct()')。 – paleozogt 2011-05-20 20:50:41