我对typedef struct类和函数中的构造有奇怪的行为.不同之处在于,在第一种情况下,所有定义都在类定义期间执行.另一种情况 - 在函数定义期间.看看我的代码.
class C
{
public:
//struct xStruct;
typedef struct xStruct* xPtr;
typedef struct xStruct {xPtr F;} xStructR;
typedef struct { xPtr First; } xPtr_Type;
void F(void **Var)
{
xPtr Ptr = 0;
((xPtr_Type*)Var)->First = Ptr->F; //errors
}
};
void Fu()
{
typedef struct qxStruct* qxPtr;
typedef struct qxStruct {qxPtr qF;} qxStructR;
typedef struct { qxPtr qFirst; } qxPtr_Type;
qxPtr qPtr = 0;
void **qVar = 0;
((qxPtr_Type*)qVar)->qFirst = qPtr->qF;
}
Run Code Online (Sandbox Code Playgroud)
在使用MS编译器(cl.exe)进行编译期间,我有两个错误:
error C2027: use of undefined type 'xStruct'
error C2227: left of '->F' must point to class/struct/union
Run Code Online (Sandbox Code Playgroud)
如果我取消注释struct xStruct声明我的代码工作.但我无法理解为什么类似的代码在Fu没有struct xStruct声明的情况下在函数中工作正常?似乎编译器在类定义期间有更严格的代码分析算法......
我看到一个区别:
在class C编译器中处理struct xStruct从全局命名空间的第一次出现.第二个来自class C命名空间 - 这就是分配期间出错的原因.
class C
{
public:
//struct xStruct;
typedef struct xStruct* xPtr;
// ^^^^^^^^^^^^^^ forward declaration of global type ::xStruct
typedef struct xStruct {xPtr F;} xStructR;
// ^^^^^^^^^^^^^^^^^^^^^^^^ definition of local type C::xStruct
typedef struct { xPtr First; } xPtr_Type;
// ^^^^^ pointer to ::xStruct not C::xStruct
void F(void **Var)
{
xPtr Ptr = 0;
// ^^^ pointer to global incomplete type
((xPtr_Type*)Var)->First = Ptr->F; //errors
// ^^^^^^ using of ::xStruct which is incomplete
}
Run Code Online (Sandbox Code Playgroud)
在全局函数示例中,两个定义都来自全局命名空间,因此没有问题.
为了证明这一点,我扩展了你的例子 - 现在它编译没有问题:
class C
{
public:
//struct xStruct;
typedef struct xStruct* xPtr;
typedef struct xStruct {xPtr F;} xStructR;
typedef struct { xPtr First; } xPtr_Type;
void F(void **Var);
};
struct xStruct {
::xStruct* F;
};
void C::F(void **Var)
{
xPtr Ptr = 0;
((xPtr_Type*)Var)->First = Ptr->F; //no errors
}
Run Code Online (Sandbox Code Playgroud)