2017-07-20 42 views
1

下面的代码段在Eclipse不编译:上编译时显示简单的C代码不起作用(typedef的相关)

typedef int Data; 
typedef struct node* Node; 
typedef struct node { 
    Data data; 
    Node next; 
}; 

int main() { 
    Node n = newNode(); 
    return 0; 
} 

Node newNode() { 
    Node newNod; 
    newNod = malloc(sizeof(struct node)); 
    if(!newNod){ 
     return NULL; 
     printf("\naa"); 
    } 
    newNod->data = 3; 
    return newNod; 
} 

的一个错误是

error: conflicting types for 'newNode'* (line with newNode() method declaration "Node newNode() {"). 

我很无能。怎么了?

+2

“方法声明”?听起来像你正在使用C++编译器。无论如何,它不喜欢名称'newNode'用于函数名称和变量名称。 –

+0

@EugeneSh。它被用作函数名称,但没有变量具有该名称... –

+0

@CavanPage正确...误读它。 –

回答

2

newNode的定义移到main之上[或在main之上添加newNode的前向声明]。

在您的代码中,编译器在main中看到newNode的调用时,它正在使用隐式声明。当遇到实际的定义,它不匹配

+0

这确实删除了编译问题,但是该函数仍然没有做任何事情,并且也以某种方式停止了程序而没有抛出错误。我在整个程序中都有'printf'语句,所以我可以告诉程序直到newNode()方法开始。 (如果我把printf放在方法的第一行,它不会触发) –

+0

@SergeyBrin为什么'return NULL'后面有'printf()'?你想要代码做什么? –

+0

噢,别介意,打印流搞砸了......现在好了 –

0

声明

typedef struct node { 
    Data data; 
    Node next; 
}; 

是不正确的。 typedef需要这种类型的名称,就像您在typedef struct node* Node;中所做的那样。 既然你只需要定义struct node没有一个typedef,你应该删除这个词typedef在此声明:

struct node { 
    Data data; 
    Node next; 
}; 
0

有一个古老的想法,被标准化之前的C语言,其中已被调用的函数,但尚未宣布,是隐含声明。在这种声明中,默认返回值为int

隐式声明之后,出现了定义,所以编译器很困惑。

有2个解决方案,以此,

  1. main()之前Delcare的功能,即main()之前添加

    Node newNode(); 
    

  2. main()之前移动整个newNode()的定义。

现在我们已经解决了这个问题,请注意,指针typedef是一个坏主意。从代码中可以看出,这种类型的变量实际上是指针。而且由于它们是否是指针有一个非常重要的区别,你应该尽可能清楚。