C结构:typedef怀疑!

C结构:typedef怀疑!,c,struct,typedef,C,Struct,Typedef,在给定的代码段中,我希望找不到错误符号记录。但它在VisualStudio2010编译器上编译并运行良好。我从VisualStudio2010命令提示符以C程序的方式运行它- cl记录.c 记录 现在的疑问是,typedef是否检查符号?它是否更像一个转发声明 #include "stdio.h" #include "conio.h" typedef struct Record R; struct Record { int a; }; int main() { R ob

在给定的代码段中,我希望找不到错误
符号记录
。但它在VisualStudio2010编译器上编译并运行良好。我从VisualStudio2010命令提示符以C程序的方式运行它-

cl记录.c
记录

现在的疑问是,
typedef
是否检查符号?它是否更像一个
转发声明

#include "stdio.h"
#include "conio.h"

typedef struct Record R;
struct Record
{
    int a;
};

int main()
{   
    R obj = {10};
    getch();
    return 0;
}

您始终可以引用未定义的结构,毕竟这是实现链表的典型方法。当您想使用它们的字段时,只需定义它们。
包含一些详细信息。

C找不到符号记录,因为它是在代码后面声明的,就像您试图使用在代码上声明过去但未定义其原型的函数一样

您还可以将这两个声明组合起来,然后变成:

typedef struct Record
{
    int a;
} R;

它也可以工作,而且在我看来,甚至更好,不是因为它可以更快,而是因为它更小。

typedef
必须在定义第一个参数后使用

struct Record
{
    int a;
};
typedef struct Record R;


如果需要在结构中使用
struct Record
,只需使用
struct Record

typedef struct Record
{
    struct Record *next;
}
typedef struct Record R;

尝试放置
typedef结构记录R
struct Record…
@xhan下-如果我这样做,它是有意义的,因为符号
Record
在前面找到。谢谢。您的代码在GCC(必须将getch更改为getchar)和VS2005下运行良好。我怀疑你的发现是对的。较小的可能重复是typedef结构{inta;}R;
typedef struct Record
{
    struct Record *next;
}
typedef struct Record R;