Xcode中的C ++:使用宏生成的枚举中未声明的标识符

时间:2015-01-14 09:35:45

标签: c++ xcode visual-c++ macros enums

我得到了这组代码,它们在编译期间有一个宏生成枚举。

MakeEnum4(EnumName, Value1, Value2, Value3, Value4);

MakeEnum4是另一个具有以下定义的宏函数的别名:

/// Here _Indexed() is an empty macro
#define MakeEnum4(name,v1,v2,v3,v4) _Expand4(name, _Indexed(), v1, v2, v3, v4)

_Expand4的定义如下:

#define _Expand4(name, mode, value1, value2, value3, value4)                    \
  namespace name                                                                \
  {                                                                             \
     typedef uint Type;                                                         \
     // cstr is typedef as const char*                                          \
     static const cstr EnumName = #name;                                        \
     enum Enum { value1 = mode 0, value2 = mode 1, value3 = mode 2,             \
                 value4 = mode 3 };                                             \
     enum { Size = 4 };                                                         \ 
     static const cstr Names[] = { #value1, #value2, #value3, #value4, NULL };  \
  }                                                                             \

所以这就是问题所在:

在某个头文件中生成了一个枚举,我们称之为Declaration.h:

//in Declaration.h

MakeEnum4(SomeEnum, TypeA, TypeB, TypeC, TypeD);

然后在另一个文件中调用FooHeader.h,一个模板函数正在调用这个生成的枚举SomeEnum:

//in FooHeader.h

template < typename type >
SomePtr* Foo(cstr name, SomeType*& someType, /*unrelated function pointer*/)
{
  someType = new SomeType(name, sizeof(type), CompileTimeId<type>(), SomeEnum::TypeA);
  //...
}

这里SomeEnum被C ++编译器标记为Xcode用作“使用未声明的标识符'SomeEnum'”。同一组代码在Visual Studio 2010上编译良好。此项目是一个跨平台项目,用于将同一组C ++库移植到Apple的平台。

我想这可能是因为FooHeader.h的翻译单元没有及时生成枚举,但我不知道如何绕过它。对此有任何见解表示赞赏。

很抱歉,如果我提供的代码含糊不清,那是因为我的内容是在一些非常严格的NDA下。

0 个答案:

没有答案