Gcc编译器

今天无意写了一段代码,发现了VC编译器与GUN的gcc编译器还是存在区别的。毕竟GCC支持的是标准C。

[cpp] view plain copy
  1. #include <stdio.h>  
  2.   
  3. struct Node  
  4. {  
  5.     int value;  
  6.     Node *next;  
  7. };  
  8. int main()  
  9. {  
  10.     Node a;  
  11.     a.value = 1;  
  12.     return 0;  
  13. }  

上述代码在GCC下是编译失败的,提示的错误:uknown typename 'Node'.但是放到VC编译器下则顺利编译通过。

于是按照标准C写了另外一个版本。

[cpp] view plain copy
  1. #include <stdio.h>  
  2.   
  3. struct Node  
  4. {  
  5.     int value;  
  6.     struct Node *next;  
  7. };  
  8. int main()  
  9. {  
  10.     struct Node a;  
  11.     a.value = 1;  
  12.     return 0;  
  13. }  

则通过标准C编译,因为此处Node的作用就是一个标签。除非使用typedef才可以作为类型直接使用。否则标签前面还是要加上struct关键字。

下面是使用typedef创建的类型名,但是需要定义一个标签来致命结构体内部的指针。

[cpp] view plain copy
  1. #include <stdio.h>  
  2.   
  3. typedef struct  Node1   
  4. {  
  5.     int value;  
  6.     struct Node1 *next;  
  7. }Node;  
  8. int main()  
  9. {  
  10.     Node a;  
  11.     a.value = 1;  
  12.     return 0;  
  13. }  
不过下面这种方式在GCC编译也通过

[cpp] view plain copy
  1. #include <stdio.h>  
  2.   
  3. typedef struct   
  4. {  
  5.     int value;  
  6.     struct Node *next;  
  7. }Node;  
  8. int main()  
  9. {  
  10.     Node a;  
  11.     a.value = 1;  
  12.     return 0;  
  13. }  

说明在结构体内部声明指向结构体自身的指针使用标签形式,是因为标签没有声明。在标签前面添加struct则认为此处声明是合法的一个指针,但是由于标签未声明则此指针具体指向什么类型的结构体则是不知道的,此处是有隐患的,只是通过了语法检测而已。

根据上述推测,我写了另外一个版本

[cpp] view plain copy
  1. #include <stdio.h>  
  2.   
  3. typedef struct   
  4. {  
  5.     int value;  
  6.     struct Node1 *next;  
  7. }Node;  
  8. int main()  
  9. {  
  10.     Node a;  
  11.     a.value = 1;  
  12.     return 0;  
  13. }  

阅读更多
想对作者说点什么? 我来说一句

linux gcc编译器

2010年06月23日 19KB 下载

GCC编译器的源代码

2011年11月22日 25.33MB 下载

GNU gcc编译器手册下载.rar

2009年02月16日 396KB 下载

gcc编译器完全介绍中文版

2009年09月27日 373KB 下载

android平台下的gcc编译器

2012年09月18日 20.24MB 下载

linux下gcc编译器

2010年03月19日 323KB 下载

没有更多推荐了,返回首页

不良信息举报

Gcc编译器

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭