解决警告C4133:'=':不兼容的类型 - 从struct到struct

时间:2016-04-05 10:49:04

标签: c visual-studio-2013 struct

我的应用程序中有类似的结构。

 typedef struct _Test
    {
        int n;
        struct Test *Next;
    }Test;

int main(int argc, char **argv)
{
    Test tmp, tmp1;

    tmp.n = 1;
    tmp.Next = NULL;

    tmp1.n = 0;
    tmp1.Next = &tmp;

    return 0;
}

在第

tmp1.Next = &tmp;

我收到以下警告消息: 警告C4133:'=':不兼容的类型 - 从'测试*'到'测试*'

上述代码有什么问题?

2 个答案:

答案 0 :(得分:7)

typedef struct _Test
{
    int n;
    struct Test *Next; // --> struct Test is not a type here
}Test;

应该是

typedef struct _Test
{
    int n;
    struct _Test *Next; // --> struct _Test is a type
} Test;

因此,为了定义任何对象,它应该具有有效的数据类型,否则最终会出错。

答案 1 :(得分:4)

当你有:

typedef struct _Test
{
    int n;
    struct Test *Next;
} Test;

标记名称空间中存在_Test名称。您可以使用struct _Test声明该类型的结构。在结构定义中,您使用struct Test。由于尚未声明此名称的结构,因此它被视为不完整类型。有一个指向不完整结构类型的指针是合法的,但在完全声明它之前取消引用它是非法的。

您应该避免使用以下划线后跟大写字母开头的名称,因为这些标识符是保留的。你应该使用:

struct Test
{
    int n;
    struct Test *next;
};

或者,如果您不想键入struct Test并希望在任何地方只输入Test,则可以按照以上步骤操作:

typedef struct Test Test;

由于缺少更好的单词,因此将Test名称从标记名称空间中复制出来,以便在没有前面的struct关键字的情况下使用它。