我使用include定义枚举,因为有不同的枚举具有相同的枚举数据,我想重用它:
#define X(SYM) SYM
#define X_INIT(SYM,VAL) SYM = VAL
/// Destination for scalar memory read instruction
enum SSRC
{
#include "GenericInstructionFields1.h"
#include "ScalarInstructionFields.h"
#include "GenericInstructionFields2.h"
};
enum SDST
{
#include "GenericInstructionFields1.h"
};
#undef X_INIT
#undef X
};
但是我不能编译SDST的代码。编译器为SSRC的字段写入重新定义,该字段来自“GenericInstructionFields1.h”。问题的原因是什么?如何解决?
//GenericInstructionFields1.h
/// SGPR0 to SGPR103: Scalar general-purpose registers.
X_INIT(ScalarGPRMin,0),
X(ScalarGPR),
X_INIT(ScalarGPRMax,103),
/// 104 – 105 reserved.
X(Reserved104),
X(Reserved105),
X_INIT(Reserved,2),
/// vcc[31:0].
X_INIT(VccLo, 106),
/// vcc[63:32].
X(VccHi),
答案 0 :(得分:4)
您不能在同一名称空间中使用相同的枚举器进行枚举。这将重现您的问题:
enum X {A,B};
enum Y {A};
使用命名空间或为枚举值添加前缀。
答案 1 :(得分:1)
枚举与命名空间不同。
您将在以下
中看到相同的错误enum A
{
P, Q
};
enum B
{
P, Q
};
你可以通过这个
实现你想要的struct A
{
enum { P, Q };
};
struct B
{
enum { P, Q };
};
你现在可以使用A :: P,A :: Q,B :: P& B :: Q
或者在你的情况下
#define X(SYM) SYM
#define X_INIT(SYM,VAL) SYM = VAL
/// Destination for scalar memory read instruction
struct SSRC
{
enum
{
#include "GenericInstructionFields1.h"
#include "ScalarInstructionFields.h"
#include "GenericInstructionFields2.h"
}
};
struct SDST
{
enum
{
#include "GenericInstructionFields1.h"
}
};
#undef X_INIT
#undef X
};
您现在可以使用SSRC::ScalarGPRMax
和SDST::ScalarGPRMax