您好开发商!我正在从Skiena的《算法设计手册》中学习算法。那里我有以下代码:

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

typedef int item_type;

typedef struct{
    item_type item;
    struct list* next;
    }list;

void insert_list(list **l, item_type x){
    list *p;
    p = malloc(sizeof(list));
    p->item = x;
    p->next = *l;
    *l = p;
    }

int main(){
    return 0;
    }

编译时给我警告:



但是当我将此代码重写为C++时:
 #include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

typedef int item_type;

typedef struct{
    item_type item;
    struct list* next;
    }list;

void insert_list(list **l, item_type x){
    list *p;
    p = malloc(sizeof(list));
    p->item = x;
    p->next = *l;
    *l = p;
    }

int main(){
    return 0;
    }

它给出以下内容:



谁能解释为什么会这样?以及如何用C++重写它?

最佳答案

在这两种情况下,您的问题都在结构定义中:struct list *next不引用您在声明过程中的结构。尝试以下方法:

typedef struct list {
    item_type item;
    struct list* next;
} list;

另外,在C++中,必须将void *返回的malloc强制转换为适当的指针类型(list *),C++在这些方面更严格。另外,顺便说一句,在C++中,您可以根据需要完全放弃typedef。

错误消息不同的原因是语言不同。

在C语言中,编译器知道struct list *是指向结构的指针,因此它不需要抱怨它实际上还不知道“结构列表”是什么。但是,稍后,当您尝试从类型为“列表*”(类型为“指向匿名结构的指针”)的指针分配此“结构列表*”时,它会抱怨不匹配。

在C++中,“结构”声明或多或少与“类”声明等效(主要区别在于成员的默认可见性)。除其他外,这意味着C++中的结构或多或少会自动进行类型定义。因此,当编译器看到“struct list * next”时,它将其视为名为“list”的类的前向声明;然后,当它完成语句并处理typedef时,将引发错误,因为您正尝试将某些内容(已经(向前)声明为其他内容)输入typedef。然后它发出了进一步的错误,因为由于较早的错误,它实际上并不知道“列表”可能是什么。

关于c++ - 像C++一样编码时C代码不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6915635/

10-14 12:05
查看更多