我得到了这组代码,它们在编译期间有一个宏生成枚举。
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下。