我为自己的练习目的编写了一些代码,但有趣的事情发生了。我原本试图编写一个C ++代码,但是我忘记了包含streamio库和使用命名空间std,然后我在编码期间一直使用printf()函数。
我认为对我来说最令人困惑的部分是我使用.cpp扩展并使用VS 2015编译器编译此程序但我实际上是用C风格编写的。有人能告诉我,我写过C或C ++代码吗?
以下是源代码:
#include "stdafx.h"
#include <stdlib.h>
typedef struct node
{
int data;
node *next;
}node;
node *create()
{
int i = 0;
// Each variable must be assign to some value in the function
node *head, *p, *q = NULL;
int x = 0;
head = (node *)malloc(sizeof(node));
while (1)
{
printf("Please input the data: ");
scanf_s("%d", &x);
if (x == 0)
break;
p = (node *)malloc(sizeof(node));
p->data = x;
if (++i == 1) {
head->next = p;
}
else
{
q->next = p;
}
q = p;
}
q->next = NULL;
return head;
}
void printList(node head)
{
node *tmp = &head;
int counter = 0;
printf("Print out the list: \n");
while (tmp->next != NULL) {
tmp = tmp->next;
counter++;
//surprise to me printf() is pretty advance...
printf("%d item in the list: %d\n",counter, tmp->data);
}
}
int main()
{
printList(*create());
return 0;
}
答案 0 :(得分:5)
据我所知,您的代码是有效的C ++。它不是有效的C,但只需要很少的努力就可以成为有效的C.
C 几乎是 C ++的一个子集,但是有效的C代码不是有效的C ++代码 - 当然还有很多的有效C ++代码有效的C代码。
使您的代码无效为C的一件事是使用名称node
:
typedef struct node
{
int data;
node *next;
}node;
在C ++中,struct node
定义使该类型可以显示为struct node
或node
。在C中,struct
定义本身仅创建名称struct node
。在node
完成之前,名称typedef
不可见 - 它不在您定义node *next;
的位置。
如果使用.c
后缀重命名源文件并将其编译为C,编译器将抱怨node
是未知类型名称。