2011-05-20 47 views
1

我有一個需要共享一段數據的相關函數的文件。儘管我想避免使用全局變量,但我能想到的最佳解決方案是在文件中聲明靜態,但我想將範圍限制爲文件。我認爲這可以通過static聲明完成。還有其他優越的選擇嗎?替代C中的成員變量

在面向對象的環境中,它們都是類的成員。

回答

3

不,聲明一個全局靜態變量幾乎涵蓋了你需要做的事情(假設變量需要改變;否則使用一個宏)。您可以在全局級別聲明一個靜態變量,並使其對文件保密。

此外,請注意,這完全不是線程安全的。

1

static會限制範圍到當前編譯(文件)。但這是一個全球性的聲明。另一種方法是將函數中的對象作爲參數傳遞給函數。這很常見。

2

A static將限制範圍到文件,但只有一個。這意味着如果涉及任何狀態,您只能擁有該組函數的一個用戶。

最好有一個生命週期的句柄,你可以有一個範圍,但是你需要它。即:

Foo * handle = foo_create(); // Allocates and initializes a structure 

foo_operation1(handle); 
foo_operation2(handle); 

foo_destroy(handle);   // Deallocates the structure 

這保證了只有知道handle就可以做任何事情,改變它的代碼。

4

雖然一個靜態工作,我認爲你真正想要的是一個結構。每個函數都將這個結構作爲參數。因此類似於:

typedef struct mystruct_s { 
    ... 
} mystruct_t; 

void myfunc1(mystruct_t *mystruct); 
void myfunc2(mystruct_t *mystruct); 

此方法的一個優點是它的線程安全。即,您可以同時運行多個mystruct實例。它也比本質上是一個全局變量更清潔(即使它只限於一個文件)。

+0

這是一個很酷的想法。看起來它需要這些函數的調用者擁有指針的副本,我認爲可以通過調用mystruct_s * get_mystruct_ptr(){return&mystruct_t}來提供指針的副本,或者是否有方法讓調用者不知道需要它? – 2NinerRomeo 2011-05-20 20:27:08

+0

調用者需要指針。他們會在堆棧上創建結構,或者他們可以調用某種'create_mystruct()'來malloc它(請注意,您需要一個相應的'destroy_mystruct()')。 – paleozogt 2011-05-20 20:50:41