使用宏时,错误枚举没有成员

时间:2013-06-20 05:12:57

标签: c++ include c-preprocessor

我想创建两个枚举:DerivedBirdTypeBasicBirdType。 BasicBirdType具有名为BCT_ *的成员。 DerivedBirdType具有BasicBirdType中的所有成员但具有不同的前缀DCT_ *,并且它还具有不在BasicBirdType中的成员。

例如,BasicBirdType有两个成员,* BCT_waterfowl *和* BCT_loons *。和DerivedBirdType将有* DCT_waterfowl *,* DCT_loons *和一个新成员* DCT_Obama *。

我有3个文件。 Bird.h声明了重用常用名称的枚举结构和令牌解析运算符。 DerivedBirdType.h重新使用BasicBirdType.h中的成员并添加额外成员。

问题是BasicBirdType当我尝试获取BCT_ *时,现在没有成员“BCT_waterfowl”,而DerivedBirdType工作正常。

BasicBirdType bird1 = BasicBirdType::BCT_waterfowl; // enum `BasicBirdType` now has no member "BCT_waterfowl"
DerivedBirdType bird2 = DerivedBirdType::DCT_waterfowl; // works fine

Bird.h:

#pragma once
#define BASIC_BIRD_TYPE(type) BCT_##type,
#define DERIVED_BIRD_TYPE(type) DCT_##type,

namespace Bird
{
    enum DerivedBirdType
    {
        #include "DerivedBirdType.h"
        TotalDerivedBirdTypes
    };

    enum BasicBirdType
    {
        #include "BasicBirdType.h"
        TotalBasicBirdTypes
    };
}

DerivedBirdType.h:

#pragma once
#define BASIC_BIRD_TYPE(type) DERIVED_BIRD_TYPE(type)

#include "BasicBirdType.h"
DERIVED_BIRD_TYPE(Obama)

BasicBirdType.h:

#pragma once
BASIC_BIRD_TYPE(waterfowl)
BASIC_BIRD_TYPE(loons)

1 个答案:

答案 0 :(得分:2)

你的问题是当你包含头文件“DerivedBirdType.h”时已经包含了头文件“BasicBirdType.h”,因此当你在Basic枚举中包含BasicBirdType时,编译器会删除它,因为它已经被包含了

enum BasicBirdType
{
    #include "BasicBirdType.h"    // no effect, file already included
    TotalBasicBirdTypes
};

除了TotalBasicBirdTypes之外,这就是BasicBirdType枚举为空的原因