繁体   English   中英

类中的typedef结构的奇怪行为

[英]Strange behaviour with typedef struct in class

我在类和函数中使用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;
}

在使用MS编译器(cl.exe)进行编译期间,我有两个错误:

error C2027: use of undefined type 'xStruct'
error C2227: left of '->F' must point to class/struct/union

如果我取消注释struct xStruct声明我的代码工作。 但我不明白为什么类似的代码在没有struct xStruct声明的Fu函数中工作正常? 似乎编译器在类定义期间有更严格的代码分析算法......

我看到一个区别:

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
    }

在全局函数示例中,两个定义都来自全局命名空间,因此没有问题。

为了证明这一点,我扩展了你的例子 - 现在它编译没有问题:

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM