2010-06-19 75 views
0

我是一個新手,我想在良好的實踐和設計中讓自己更好,所以在閱讀以下內容之前先考慮一下。DEFINE宏在所有平臺上工作?

我正在創建一個單例類,並且我有很多靜態成員。而不是每次像這樣調用成員...

THECLASS::member 

我在考慮使用一個定義的宏來縮短它。

#define(THECLASS::member, shortMember); 

所以我的問題是,這會損害跨平臺或交叉編譯器。

+4

除了下面的評論,你應該考慮[根本不使用單例模式](http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you-從未有-因爲-1995 /)。 – 2010-06-19 17:05:41

回答

7

實際上,您的定義不會在任何地方工作。它應該是:

#define shortMember THECLASS::member 

和良好的做法是不試圖挽救按鍵–可讀性更重要的是,和別人讀你的代碼,希望看到theClass描述::成員,而不是shortMember,因爲那時他知道在哪裏尋找一個定義。

+3

+1可讀性更重要。你只能輸入一段代碼(比喻),但它會被讀取很多次,而不僅僅是你自己。 – ChrisF 2010-06-19 17:02:38

+0

你有shortMember和THECLASS :: member交換。編輯:我看你已經修好了。 – 2010-06-19 17:06:14

+0

我認爲這是一個很好的觀點。 – numerical25 2010-06-19 17:15:12

1

如果你的類是由所有的靜態方法,你可以改爲聲明namespace 與方法,那麼當你要使用的方法.cpp文件,包括文件的頂部:

using namespace [your-namespace]; 

只是不要在頭文件中這樣做,否則會污染包含此頭的所有其他文件的名稱空間。

1

最有可能的,但是你打開了自己的名字空間衝突,有階級本來應該避免的,所以它可能不是一個好主意。

6

您將需要使用正確的語法的宏定義:

#define shortMember THECLASS::member 

然而,不這樣做

  • 所有的宏都在一個命名空間中,並且替換髮生在任何地方,所以最終會導致巨大的維護頭痛。

  • 這傷害了代碼的可讀性和可理解性,因爲它使得它變得更加困難,這裏的名字來自於和他們指

在這種情況下,比較好的做法是拼寫出了名的地方你用吧。

0

定義將起作用,但不是您在問題中寫入的定義。沿着線的東西:

class SingletonImpl { 
... 
SingletonImpl *getInstance() { return m_instance; } 
} 

#define SINGIMPL SingletonImpl::getInstance() 

然後可以這樣使用:

SINGIMPL->whatever(); 

但是請記住,宏只是做文本替換,因此忽略之類的命名空間。

0

要回答標題中的問題,是的,正確書寫的DEFINE可以在所有平臺上使用。然而,正如其他人所說,由於所列舉的原因,這對您的目的不是一個好主意。