2012-08-05 35 views
1

一個點我上課像下面裏面的#define

#include <iostream> 

#define Gb MemorySizeUnit.Gb 
#define Mb MemorySizeUnit.Mb 
#define Kb MemorySizeUnit.Kb 

using namespace std; 

enum MemorySizeUnit {Gb, Mb, Kb}; 

class Test 
{ 
    private: 
    MemorySizeUnit memSizeUnit; 
    int memorySize; 

    public: 
    void setMemory(const int memSize, MemorySizeUnit unit); 
} 

,我希望能夠像做

Test test; 
test.setMemory(20, Gb);// as opposed to test.setMemory(20, MemorySizeUnit.Gb) 

編譯器不一樣,在#定義,我有一個「 「。

+2

呃,你不需要'#define',枚舉成員已經在全局名稱空間中了。所有你需要的是:'test.setMemory(20,Gb);' – 2012-08-05 17:07:46

+0

Isnt MemorySizeUnit.Gb在全局命名空間中還是Gb在全局命名空間中? – Jimm 2012-08-05 17:08:58

+0

@Jimm'Gb'位於全局名稱空間中。 'MemorySizeUnit.Gb'不存在。 – sepp2k 2012-08-05 17:10:31

回答

2

只需完全刪除#define,枚舉值將自動置於外部名稱空間中。它不像C#或Java,其中枚舉值必須通過枚舉名稱空間,類似於聲明的absnet訪問。

+0

感謝您參考Java。我正在從Java過渡到C++ – Jimm 2012-08-05 17:24:19

+0

C++最近添加了'enum class {}',它的行爲更像Java。在這種情況下,你會寫'MemorySizeUnit :: Gb'。 – MSalters 2012-08-06 08:11:25

5

在宏擴展中有一個點沒有什麼錯,錯誤來自這樣一個事實,即當您在枚舉的定義中擴展宏時,會導致無效的枚舉定義。

enum MemorySizeUnit {Gb, Mb, Kb}; 

擴展爲:

enum MemorySizeUnit {MemorySizeUnit.Gb, MemorySizeUnit.Mb, MemorySizeUnit.Kb}; 

這是不是你想要的。

+0

+1用於發現遞歸擴展。就我個人而言,我會錯過它的。 – ATaylor 2012-08-05 17:09:53

+4

@ATaylor:沒有遞歸擴展(預處理器在任何情況下都不會這樣做),只是擴展並不會產生有效的代碼。 – 2012-08-05 17:13:59

+0

是這樣嗎?那麼,無論哪種情況下,+1都是值得的(我再一次讓自己變傻了):D) – ATaylor 2012-08-05 17:15:09