关于头文件里定义结构体的疑惑

dsfsdfdsfsdfsdfds 2013-09-20 10:55:21

#ifndef _Stack_H
#define _Stack_H

struct Node; /* 1 */
typedef struct Node *PtrToNode; /* 2 */
...
...
#endif

struct Node /* 3 */
{
ElementType Element;
PtrToNode Next;
}



上述程序里,我在 line1处申明了一个结构体标记, 此时尚未定义该结构体,但是在line2处直接typedef了这个只有标记的结构体, 而这个结构体我在line3处才定义。
正常的做法应该是:


struct Node
{
ElementType Element;
PtrToNode Next;
}
typedef struct Node *PtrToNode;



以上两种写法都是对的。 有大神能给我解释一下为什么只有结构体标记但尚未定义的结构体也可以使用typedef来重新定义新变量?

谢谢!
...全文
343 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dsfsdfdsfsdfsdfds 2013-09-20
  • 打赏
  • 举报
回复
引用 1 楼 jerry_dqh 的回复:
[quote=引用 楼主 u010441666 的回复:]

#ifndef _Stack_H
#define _Stack_H

struct Node;                        /* 1 */
typedef struct Node *PtrToNode;     /* 2 */
...
...
#endif

struct Node                         /* 3 */
{
    ElementType Element;
    PtrToNode   Next;
}

上述程序里,我在 line1处申明了一个结构体标记, 此时尚未定义该结构体,但是在line2处直接typedef了这个只有标记的结构体, 而这个结构体我在line3处才定义。 正常的做法应该是:


struct Node                         
{
    ElementType Element;
    PtrToNode   Next;
}
typedef struct Node *PtrToNode; 

以上两种写法都是对的。 有大神能给我解释一下为什么只有结构体标记但尚未定义的结构体也可以使用typedef来重新定义新变量? 谢谢!
typedef struct Node *PtrToNode; /* 2 */ 这个定义其实编译并不需要知道struct node具体的结构。只有你在程序中使用到了struct Node,那么编译器才会要知道struct Node的结构,举个例子 main() { PtrToNode pNode; //在这个时候,编译器不需要知道node的结构,因为没有到node相关的变量,这里其实就是定义了一个指针,如果只有这句,连struct node这个结构都可以不定义。 pNode->Next = NULL;//在编译器处理到这句话,实际才会真正分析struct node结构,如果这个时候没有struct node的定义,则会报错了。 } [/quote] 见上楼。
dsfsdfdsfsdfsdfds 2013-09-20
  • 打赏
  • 举报
回复
谢谢! 跟我猜测的一样。 不过你是怎么了解的? 这些在K.R那本书里好像没有提到。 能推荐一本涉及到C的底层编译和链接的书吗? 最好是在linux下的。 谢谢!
碼上道 2013-09-20
  • 打赏
  • 举报
回复
引用 楼主 u010441666 的回复:

#ifndef _Stack_H
#define _Stack_H

struct Node;                        /* 1 */
typedef struct Node *PtrToNode;     /* 2 */
...
...
#endif

struct Node                         /* 3 */
{
    ElementType Element;
    PtrToNode   Next;
}

上述程序里,我在 line1处申明了一个结构体标记, 此时尚未定义该结构体,但是在line2处直接typedef了这个只有标记的结构体, 而这个结构体我在line3处才定义。 正常的做法应该是:


struct Node                         
{
    ElementType Element;
    PtrToNode   Next;
}
typedef struct Node *PtrToNode; 

以上两种写法都是对的。 有大神能给我解释一下为什么只有结构体标记但尚未定义的结构体也可以使用typedef来重新定义新变量? 谢谢!
typedef struct Node *PtrToNode; /* 2 */ 这个定义其实编译并不需要知道struct node具体的结构。只有你在程序中使用到了struct Node,那么编译器才会要知道struct Node的结构,举个例子 main() { PtrToNode pNode; //在这个时候,编译器不需要知道node的结构,因为没有到node相关的变量,这里其实就是定义了一个指针,如果只有这句,连struct node这个结构都可以不定义。 pNode->Next = NULL;//在编译器处理到这句话,实际才会真正分析struct node结构,如果这个时候没有struct node的定义,则会报错了。 }
dsfsdfdsfsdfsdfds 2013-09-20
  • 打赏
  • 举报
回复
引用 4 楼 jerry_dqh 的回复:
[quote=引用 2 楼 u010441666 的回复:] 谢谢! 跟我猜测的一样。 不过你是怎么了解的? 这些在K.R那本书里好像没有提到。 能推荐一本涉及到C的底层编译和链接的书吗? 最好是在linux下的。 谢谢!
其实不需要纠结这些,。C语言本身也不需要区分windows,linux下。关键还是把C语言本身学好。是否有哪本书讲到底层编译和链接,我也不了解,项目做多了,其实这些知识就知道了。 推荐看一下《C陷阱与缺陷》《C专家编程》《c和指针》,这三本书还是推荐看一下。[/quote] 个人对windows有极度厌恶感,所以一直用linux下的gcc --只是个人喜好而已,呵呵
AnYidan 2013-09-20
  • 打赏
  • 举报
回复
google 不完全定义,
碼上道 2013-09-20
  • 打赏
  • 举报
回复
引用 2 楼 u010441666 的回复:
谢谢! 跟我猜测的一样。 不过你是怎么了解的? 这些在K.R那本书里好像没有提到。 能推荐一本涉及到C的底层编译和链接的书吗? 最好是在linux下的。 谢谢!
其实不需要纠结这些,。C语言本身也不需要区分windows,linux下。关键还是把C语言本身学好。是否有哪本书讲到底层编译和链接,我也不了解,项目做多了,其实这些知识就知道了。 推荐看一下《C陷阱与缺陷》《C专家编程》《c和指针》,这三本书还是推荐看一下。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧