我的应用程序中有类似的结构。
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:'=':不兼容的类型 - 从'测试*'到'测试*'
上述代码有什么问题?
答案 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
关键字的情况下使用它。