0

自从我用 C 编码以来已经很久了,现在我什至无法创建链表 :(NodeType结构可能有什么问题?我什至尝试了这个例子,但我仍然得到与此类似的错误。

我需要创建可以在 linux 和 windows 上运行的链表(无需大量修改)。

我编译使用:cl myFile.c命令。

错误信息:

Microsoft (R) 32 位 C/C++ 优化编译器版本 16.00.40219.01,适用于 80x86 版权所有 (C) Microsoft Corporation。版权所有。

unlock.c unlock.c(46) : error C2275: 'Node' : 非法使用这种类型作为表达式 unlock.c(17) : 见'Node'声明 unlock.c(46) : error C2146: 语法错误: 失踪 ';' 在标识符“a”之前 unlock.c(46):错误 C2065:“a”:未声明的标识符

源代码:

#include <stdio.h>
#include <windows.h>
#include<stdlib.h>


typedef enum {STABLE, RPUSH, LPUSH} STATUS_TYPE;


typedef struct NodeType
{
    struct NodeType* _left;
    struct NodeType* _right;
    int _value;
}Node;

typedef struct AnchorType
{
    struct Node* _mostLeft;
    struct Node* _mostRight;
    STATUS_TYPE _status;
} Anchor;

Node CreateNode(int data)
{
    Node newNode;
    newNode._value = data;
    newNode._left = NULL;
    newNode._right = NULL;

    return newNode;
}


int main()
{
    Anchor anchor;
    anchor._mostLeft = NULL;
    anchor._mostRight = NULL;
    anchor._status = STABLE;


    Node a; //<-- What might be wrong ?

    return 0;
}

感谢帮助。

4

2 回答 2

3

微软专注于 C++ 编译器,他们的 C 支持已经过时了几十年。

Microsoft 编译器不支持的较新 C 标准的功能之一是能够在函数中间声明变量。

将声明移到顶部,一切都会好的:

int main()
{
    Anchor anchor;
    Node a; // ok here
    anchor._mostLeft = NULL;
    anchor._mostRight = NULL;
    anchor._status = STABLE;


    //Node a; but not here

    return 0;
}
于 2012-09-26T18:42:34.937 回答
0

问题是您的structure 标签为NodeType,但typedef标签为Node。两者都应该指同一件事。如:

typedef struct Node
{ 
    struct Node* _left; 
    struct Node* _right; 
    int _value; 
} Node;

这将创建一个typedef名为.Nodestruct Node

在 Microsoft 编译器目标代码中,您通常会看到:

typedef struct Node
{ 
    struct Node* _left; 
    struct Node* _right; 
    int _value; 
} tagNode;

typedef struct Anchor
{ 
    struct Node* _mostLeft; 
    struct Node* _mostRight; 
    STATUS_TYPE _status; 
} tagAnchor; 

tagNode永远不会在 Microsoft 编译器代码中使用,只是Node. Microsoft 编译器会对此非常满意,阅读您的代码的人会知道您指的是结构。

有关更多详细信息,包括 C 和 C++ 命名类型定义和标签的历史,请参阅发布在以下位置的答案:C++ 中“struct”和“typedef struct”的区别?

于 2012-09-26T19:00:05.543 回答