您好开发商!我正在从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/