C++ PhysX解读

#最近在学习和解读PhysX
看到两个头文件
头文件一:

// PxSimpleTypes.h
namespace physx    
{
    typedef uint32_t PxU32;    
    ...
}

头文件二:

// Px.h
#include "PxSimpleTypes.h"
namespace physx
{
    typedef uint32_t PxU32;    
    class PxAllocatorCallback;
    ...
}

查找资料得知可以在多个头文件中定义相同名字的命名空间,但是不允许命名空间出现相同的名字,并且最终命名空间会被合成到一起。
问题一:头文件一已经在physx命名空间中定义了类型PxU32,头文件二为什么能定义同名类型,并且有什么必要定义这个已经定义的类型?
问题二:头文件二中使用了类PxAllocatorCallbak,这个类的头文件并没有被头文件二引用,反而是这个类的头文件引用了头文件二,为什么可以访问到这个类?

问题一:这是C++中的namespace作用域规则。在不同的头文件中定义相同名字的namespace,它们会被合并为一个namespace。所以第二个头文件定义的PxU32其实和第一个头文件定义的是一个类型。这样做的目的可能是为了在不同的头文件中使用相同的命名空间,而不必在每一个头文件中都定义完整的namespace。
问题二:这是因为C++支持forward declaration。PxAllocatorCallback类在Px.h中被forward declared了,所以可以在Px.h中使用这个类名,尽管它的完整定义在其他头文件中。 forward declaration只是声明一个类存在,而不定义它,这样可以在不包含完整定义的情况下使用该类。
所以总结来说:

  1. 同名namespace的作用域会被合并,所以第二个头文件中定义的PxU32和第一个头文件中定义的是一个类型。
  2. 通过forward declaration可以在不包含完整定义的情况下使用一个类。Px.h通过forward declaration使用了PxAllocatorCallback类。