CC编译器问题



我正在尝试编写一个简单的代码来以C语言构造树。以下是我的代码片段。

#include<stdio.h>
struct node
{
  int data;
  struct node *left;
  struct node *right;
};
int main()
{
  struct node *root = newNode(5);
  //struct node *root = NULL; working piece
  //newNode(&root,5); working piece
  if(root == NULL)
  {
    printf("No rootn");
    return 0;
  }
  //root->left = newNode(4);
  //root->right = newNode(3);
  //root->left->left = newNode(2);
  //root->right->right = newNode(1);
  return 0;
}
struct node* newNode(int data)
{
  struct node *temp;
  temp = (struct node*) malloc(sizeof(struct node));
  temp->data = data;
  temp->left = NULL;
  temp->right = NULL;
  return(temp);
}

当我尝试返回结构节点地址时,编译器给我错误

"rightNode.c", line 29: identifier redeclared: newNode
        current : function(int) returning pointer to struct node {int data, pointer to struct node {..} left, pointer to struct node {..} right}
        previous: function() returning int : "rightNode.c", line 12

但是,当我评论此 struct node* newNode(int data)并尝试定义一个函数,该函数通过将结构的地址传递给下面的函数来返回int时,它不会显示出任何错误。

int newNode(struct node **root,int data)
{
  printf("Inside New Noden");
  return 0;
}

我知道,将结构的地址返回到调用功能是合法的。

这与编译器有关。

我在UNIX环境中使用CC编译器

type cc
cc is a tracked alias for /apps/pcfn/pkgs/studio10/SUNWspro/bin/cc

以下是我用来编译cc rightNode.c

的命令

任何帮助将不胜感激...

您需要在使用之前声明newNode原型。

// somewhere after struct node definition and before first use
struct node* newNode(int);

您还需要包括stdlib.h才能获取malloc

将此struct node* newNode(int data)放在代码上方,并包括stdlib.h

如果要在声明函数之前使用功能原型,则需要一个函数原型。也在stdlib.h。

中定义了malloc

呼叫struct node *root = newNode(5);时没有可见的函数原型,因此编译器会感到困惑。

编译器找不到函数声明时,它假定存在此函数,但返回int。在main中调用newNode(...)之前声明struct node* newNode(int data);

在C的较旧版本中,您无需在使用它之前声明功能。在较旧的C中,假定未声明的功能返回int并接受未指定的参数。这就是您遇到错误的原因,因为编译器假设newNode函数返回int,而不是struct node *

在现代C(C99及更新)中,您不能再这样做。您必须在使用功能之前声明功能。一些编译器仍然允许旧行为并警告它,但是严格符合的C99程序不能先声明它。

在您的情况下,应将以下代码行放在main函数之前。这告诉编译器有关newNode函数及其应如何称呼:

struct node *newNode(int);

相关内容

  • 没有找到相关文章

最新更新