C源程序在VC6.0和gcc进行源代码移植问题


C语言早期发展【该部分为网友所写(拷贝)】

1969-1973年在美国电话电报公司(AT&T)贝尔实验室开始了C语言的最初研发。根据C语言的发明者丹尼斯·里奇 (Dennis Ritchie) 说,C 语言最重要的研发时期是在1972年。

说明:丹尼斯·里奇(Dennis Ritchie),C语言之父,UNIX之父。1978年与布莱恩·科尔尼干(Brian Kernighan)一起出版了名著《C程序设计语言(The C Programming Language)》,现在此书已翻译成多种语言,成为C语言方面最权威的教材之一。2011年10月12日(北京时间为10月13日),丹尼斯·里奇去世,享年70岁。

C
语言之所以命名为C,是因为C语言源自Ken Thompson发明的 B语言,而B语言则源自BCPL语言。

C
语言的诞生是和UNIX操作系统的开发密不可分的,原先的UNIX操作系统都是用汇编语言写的,1973年UNIX操作系统的核心用C语言改写,从此以后,C语言成为编写操作系统的主要语言

K&RC

1978年,丹尼斯·里奇(Dennis Ritchie)和布莱恩·科尔尼干(Brian Kernighan)出版了一本书,名叫《The C Programming Language》(中文译名为《C程序设计语言》)。这本书被C语言开发者们称为“K&R”,很多年来被当作C语言的非正式的标准说明。人们称这个版本的C语言为“K&R C”。

1988
年丹尼斯·里奇(Dennis Ritchie)和布莱恩·科尔尼干(Brian Kernighan)修改此书,出版了《The C ProgrammingLanguage》第二版,第二版涵盖了ANSI C语言标准。第二版从此成为大学计算机教育有关C语言的经典教材,多年后也没再出现过更好的版本。

ANSIC 和 ISO C

1970到80年代,C语言被广泛应用,从大型主机到小型微机,也衍生了C语言的很多不同版本。

为统一C语言版本,1983年美国国家标准局(American National StandardsInstitute,简称ANSI)成立了一个委员会,来制定C语言标准。1989年C语言标准被批准,被称为ANSIX3.159-1989 "Programming Language C"。这个版本的C语言标准通常被称为ANSI C。又由于这个版本是 89 年完成制定的,因此也被称为 C89。

后来 ANSI 把这个标准提交到 ISO(国际化标准组织),1990年被ISO 采纳为国际标准,称为 ISO C。又因为这个版本是1990年发布的,因此也被称为C90。

ANSI C(C89)
与 ISO C(C90)内容基本相同,主要是格式组织不一样。

因为 ANSI 与 ISO 的C标准内容基本相同,所以对于C标准,可以称为ANSI C,也可以说是ISO C,或者ANSI / ISO C。

注意:以后大家看到 ANSI C、ISO C、C89、C90,要知道这些标准的内容都是一样的。

目前,几乎所有的开发工具都支持 ANSI/ ISO C 标准。是C语言用得最广泛的一个标准版本。

C99

在ANSIC标准确立之后,C语言的规范在很长一段时间内都没有大的变动。1995年C程序设计语言工作组对 C语言进行了一些修改,成为后来的1999年发布的 ISO/IEC 9899:1999标准,通常被成为C99。

但是各个公司对C99的支持所表现出来的兴趣不同。当GCC和其它一些商业编译器支持C99的大部分特性的時候,微软和Borland却似乎对此不感兴趣。

说明:GCC(GNU CompilerCollection,GNU编译器集合)是一套由GNU工程开发的支持多种编程语言的
编译器。

综上所述,目前广泛使用的C语言版本是 ANSI / ISO C,最经典的C语言教材是《C程序设计语言(The C Programming Language) 第二版》。

很多编程语言都深受C语言的影响,比如C++(原先是C语言的一个扩展)、C#、Java、PHP、Javascript、Perl、LPC和UNIX的C Shell等。

也正因为C语言的影响力,掌握C语言的人,再学其它编程语言,大多能很快上手,触类旁通,很多大学将C语言作为计算机教学的入门语言。


一:判断明白我的gcc和vc6.0的支持的C版本:【个人见解】

    1,我的GCC支持的C版本:#include <stdbool.h>:    该文件(可以直接使用布尔型)为C99标准(C99之前的ANSI C等均是不支持的),在我的PC的ubuntu下的gcc是可以编译的,故我的gcc至少遵循C99标准(较新版本)。

    2,我的window下的vc6.0支持的C版本:

    先在vc6.0写一段代码:

             #include<stdio.h>

            void main(void)

             {

                int i;

                printf("Hello World/n");

                int j;

             }

B编辑完后将该代码文件存成了test.c(注意是.C文件)

然后编译的时候出现了error,error C2143: syntaxerror : missing ';' before 'type'

感觉很奇怪,细细看来所有的语法都似乎都是对的,更奇怪的是把文件改成cpp或者cc能正常编译,把int a;和if调换下也能正常编译。

 原因:【先明白一点在K&R C中规定:当变量的声明放在可执行代码之后,被只支持K&R C的编译器认为是非法的,即出现了上述的错误,但在ANSI C中是把这种规则废除了的,即支持变量的声明放在可执行代码之后(方便C与C++兼容)】

    将该代码文件改成.cpp或者.cc能正常编译,说明visual c++6.0的.CPP文件支持ANSIC(一个广泛使用的标准)。但是保存为.c文件就会出错,说明Visual c++ 6.0的.c文件确只支持K &R C版本(该版本让用户将变量放在可执行代码的后面可能是为了:变量名的最迟绑定有利于增加代码的可读性等)。

但是,当在VC6.0(.cpp)添加头文件:<stdbool.h>时,编译器说找不到的,说明VC6.0并不完全支持最新的C99;再次测试时,发现VC6.0(.cpp)文件支持bool(占一个字节),false,true,等关键字,但这些都是ANSI C标准所没有的,说明我这个对.cpp文件代码进行编译的编译器VC6.0值支持的标准超过了ANSIC,但没有达到C99标准。标准已经出来,编译器跟不上(或者编译器出来,标准跟不上)就是这样的情况。

总结我PC上的编译器支持的C版本排序:

排序:        VC6.0(.c文件)->VC6.0(.cpp或者.cc文件)->gcc

对应C版本:          K&R C  —>(ANSIC—C99)———>C99 

(注:逻辑不严谨,但是大致如此,给在VC6.0与gcc之间简单的正确移植C程序作参考够了)

 

二:结论

(1)在ubuntu上由gcc编写的代码移植到VC6.0(.cpp)需要降个等级(从C99->ANSIC)。即:直接拷贝到VC6.0的.cpp文件中,直接编译,按错误提示直接修改即可(有时需要参考C99与ANSIC的标准差别)。

(2)在VC6.0的.c编辑代码就算了,为什么不依据广泛使用的ANSIC标准(实际情况是已超过这个标准)在.cpp编辑呢!但是,K&R C标准规定的变量声明必须放在可执行代码前面,这个规则非常好(i:变量名的最迟绑定有利于增加代码的可读性;ii:万一代码真需要在仅支持K&R C的编译器上中编译呢)。

 

        

补判断VC6.0支持C版本的参考办法:(查看方法:安装目录F:xxxx\ VC98\INCLUDE有各种头文件,可查看文件的开头来查看其支持的C版本(文件编写时间与ANSIC版本制定公布的时间进行比较)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值