2012-07-23 56 views
2

我在C++中有一個很大的程序,它有太多的函數和全局變量。現在,我想刪除這些全局變量,我只想使用局部變量而不是全局變量。任何人都可以告訴我做這件事的最好方法。 謝謝!在C++程序中刪除全局變量

它在C++中大約有4000行程序。在這些不同的類中有10個類和60個函數,30個全局變量。全局變量用於不同類的函數之間。

+1

它有多大?你可以扔掉它並重寫它嗎? – nhahtdh 2012-07-23 04:34:27

+0

我認爲你可以將你的代碼發佈到Code Review StackExchange站點來徵求建議。 – nhahtdh 2012-07-23 04:55:12

回答

0

我建議一個解決方案,比如從全局範圍中刪除它們的聲明,並將它們放在讚賞的函數中。

Examlpe:

int hello; // global 
// remove it 

現在,把它的功能:

void func() 
{ 
    int hello; // local 
    //... 

我們有兩種情況:

如果其他一些功能需要知道的hello值,以hello作爲參數:

void func2(const int &helloVar) 
{ 
    // ... 

如果一個全局變量是由一個單一的功能只有使用時,您可以使用,而不是static局部變量..

+2

請注意靜電!根據您的編譯器設置,每個線程可能會得到不同的副本。而且,即使他們使用相同的存儲,也需要注意併發問題。 – user1118321 2012-07-23 05:00:38

+0

這不包括func2不在func()中調用的情況。在這種情況下,這兩個函數都需要'hello'作爲參數。你也假設func2不需要改變它的參數,這個參數並不總是...... – xmoex 2013-06-11 10:42:21

+0

在這種情況下,'hello'會在'main()'中聲明並傳遞給兩個函數。由於'func2'總是需要'hello'來操作,所以根本不需要改變它的參數。 – 2013-06-12 22:42:01

11

我通常通過將全局變量的命名空間開始

namespace global 
{ 
    int var; 
    ... 
} 

這將導致您在使用'var'的地方出現錯誤,那麼我只需將引用逐一替換爲名稱空間變體。一旦所有的全局變量引用是命名空間更容易看到哪些變量是局部的,哪些是全球

if (global::var == 1) ... 

現在通過搜索global::var你需要用到它,那麼你就需要經過的變量列表在一些情況下用於查看某個變量是否在多個模塊中使用,在這種情況下,您可能需要將其作爲函數參數傳遞給其他情況,並聲明它是一個局部變量。

其繁瑣的方法,但消除全局變量總是值得去做。

+0

當我看到上半場的時候,我低估了,但是當我讀到第二個時,我把它刪除了。有趣的思維過程。 – 2012-07-23 05:11:48

+0

這是非常好的! – xmoex 2013-06-11 10:37:02

0

我會建議使用一個類。它們非常適合將變量和函數隱藏到一個組中並進行分類。這裏是基本結構:

class example 
{ 
public: 
    example(); //basic constructor 
    int function1(); //example function 
    int x; // a variable accesible globally 
private: 
    int y; // a variable only accesible by functions of the class 
}; 

調用每個函數很容易,但我不會解釋,因爲我不想開始文本牆。你可以到這個鏈接獲取更多信息:http://www.cplusplus.com/doc/tutorial/classes/

+0

爲什麼在命名空間可以完成這項工作時使用一個類? C++不是Java,並不是每件事都必須在類中。 – 2012-07-23 06:44:46

+0

全局變量之間使用了不同類的函數,那麼我怎麼能在那裏使用類呢? – viswas 2012-07-23 09:53:28

0

你可以把這些變量放在aclass中,然後在第一個地方創建指向該類的對象的指針將會使用那些變量,然後將這個指針傳遞給每個方法需要的變量,不要忘記在不使用時刪除對象。