1

同じ列挙データを持つ異なる列挙型があり、それを再利用したいので、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 用のコードをコンパイルできません。コンパイラは、「GenericInstructionFields1.h」から来る SSRC のフィールドの再定義を書き込みます。問題の原因と解決方法は?

//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),
4

2 に答える 2

4

同じ名前空間に同じ列挙子を持つ列挙体を持つことはできません。これはあなたの問題を再現します:

enum X {A,B};
enum Y {A};

名前空間を使用するか、列挙値にプレフィックスを付けます。

于 2013-01-13T15:04:33.617 に答える
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

于 2013-01-13T15:15:54.807 に答える