2012-08-05 18 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