当前位置:网站首页>C语言与C++在编码细节上的几个不同

C语言与C++在编码细节上的几个不同

2021-01-18 21:14:40 二宝真好记

​​我之前写程序,一直是类C的风格,但用g++编译器。因为喜欢面向过程的设计,又觉得c++的某些特性非常的方便。一天心血来潮,把几段程序移植到gcc,遇到几个小问题,以本文记录。

C++的继承,多态,泛型模板之类高级特性,C语言压根没有。这里也不做比较。本文中C语言都用gcc来编译,C++用g++来编译。每个例子都是g++可以通过,但gcc不能通过的情况。并给出如何让gcc通过的方法。

 

 

1、变量声明的位置

 

g++可以正常编译的代码

gcc中,会报变量i的声明不合法。c语言的变量声明必须在函数开始处,所有的代码之前。例如上图中注释的位置。如果函数很长的话,不能再作用域内随时声明变量,还是很不方便,也容易造成更多名字冲突。

别扭度:*****

 

2、函数名不可以相同

g++正常编译代码

在g++下,上面两个函数可以同时定义。参数不同,编译器都会编译成不同的函数。这也是支持多态的体现。

gcc下,函数名是不可以重复的。会报错重复定义。代码移植的时候,只能把他们改成不同的可爱的名字。对于起名困难户来说,这也是种痛苦。

别扭度:*****

 

3、不支持布尔类型

g++正常代码

gcc报错bool是没有定义的。我们可以用枚举类型来代替,或者用int类型加宏定义解决。小不方便而已,不是啥大事儿。

别扭度:*****

 

4、算不算常量?

g++正常代码

Stdout, stderr本质是指针。C++中他们可以算常量。

gcc中,报错stderr非常量。gcc中非NULL的指针都不能算常量。

修改的方法是把stderr替换成NULL,然后程序逻辑中判断为NULL的情况再赋值给stderr

别扭度:*****

 

5、结构体类型

g++正常代码

g++把struct当成了class处理,所有这个类型定义没问题。

Gcc编译这段代码会出错,提示NODE不是个类型。要用struct NODE node; 定义才能成功,前面必须跟着烦人的struct。

或者在gcc中,用typedef宏定义,可以省略烦人的struct关键词。写成这样gcc就可以通过了。

别扭度:*****

 

6、运算优先级

 

g++正常代码

Gcc会报错在a=b+1这个地方,提示等号前面不能为表达式。实际上是把b:a理解成了一个表达式。既然是优先级的问题,解决方法当然是加括号

报错解决。

别扭度:*****

----------------------------------------------------------------------------------

所以,还是用g++吧。​​​​

 
 
 
 

版权声明
本文为[二宝真好记]所创,转载请带上原文链接,感谢
https://my.oschina.net/erbaozhenhaoji/blog/4899214

随机推荐