我之前写程序,一直是类C的风格,但用g++编译器。因为喜欢面向过程的设计,又觉得c++的某些特性非常的方便。一天心血来潮,把几段程序移植到gcc,遇到几个小问题,以本文记录。
C++的继承,多态,泛型模板之类高级特性,C语言压根没有。这里也不做比较。本文中C语言都用gcc来编译,C++用g++来编译。每个例子都是g++可以通过,但gcc不能通过的情况。并给出如何让gcc通过的方法。
1、变量声明的位置
g++可以正常编译的代码
![82605495efc40bb3faa5a25347605450.png](https://i-blog.csdnimg.cn/blog_migrate/3dc0267477c488160f907632a1424793.jpeg)
gcc中,会报变量i的声明不合法。c语言的变量声明必须在函数开始处,所有的代码之前。例如上图中注释的位置。如果函数很长的话,不能再作用域内随时声明变量,还是很不方便,也容易造成更多名字冲突。
别扭度:★★★★☆
2、函数名不可以相同
g++正常编译代码
![a7a2dcd06a89f2f1a6eeab9b448393b5.png](https://i-blog.csdnimg.cn/blog_migrate/429c6ba4838faad20bf3625951d62c5d.jpeg)
在g++下,上面两个函数可以同时定义。参数不同,编译器都会编译成不同的函数。这也是支持多态的体现。
gcc下,函数名是不可以重复的。会报错重复定义。代码移植的时候,只能把他们改成不同的可爱的名字。对于起名困难户来说,这也是种痛苦。
别扭度:★★★★★
3、不支持布尔类型
g++正常代码
![195f833cb902774f027dd42cdfded87a.png](https://i-blog.csdnimg.cn/blog_migrate/23b355ec2f0831b30720d31590be3d57.jpeg)
gcc报错bool是没有定义的。我们可以用枚举类型来代替,或者用int类型加宏定义解决。小不方便而已,不是啥大事儿。
别扭度:★☆☆☆☆
4、算不算常量?
g++正常代码
![a196804fdd05a9a27c551b8667047116.png](https://i-blog.csdnimg.cn/blog_migrate/26718b9141e416682075ee088b442928.jpeg)
Stdout, stderr本质是指针。C++中他们可以算常量。
gcc中,报错stderr非常量。gcc中非NULL的指针都不能算常量。
修改的方法是把stderr替换成NULL,然后程序逻辑中判断为NULL的情况再赋值给stderr
别扭度:★★☆☆☆
5、结构体类型
g++正常代码
![0a03a34d096f2f70fad9a593c3de89d3.png](https://i-blog.csdnimg.cn/blog_migrate/864978883424f25e6530c715983da7c6.jpeg)
g++把struct当成了class处理,所有这个类型定义没问题。
Gcc编译这段代码会出错,提示NODE不是个类型。要用struct NODE node; 定义才能成功,前面必须跟着烦人的struct。
或者在gcc中,用typedef宏定义,可以省略烦人的struct关键词。写成这样gcc就可以通过了。
![e879f7b74a4f45f3b8469135eef0aa82.png](https://i-blog.csdnimg.cn/blog_migrate/6d6214a2d3dcecf80cce6857efbdef99.jpeg)
别扭度:★★☆☆☆
6、运算优先级
g++正常代码
![d896226608d9dfcdaf25e51661762757.png](https://i-blog.csdnimg.cn/blog_migrate/9ee1854114d592051cf1b3a3900c5d2d.jpeg)
Gcc会报错在a=b+1这个地方,提示等号前面不能为表达式。实际上是把b:a理解成了一个表达式。既然是优先级的问题,解决方法当然是加括号
![90f489484c6a160709e75de028f9dee6.png](https://i-blog.csdnimg.cn/blog_migrate/93dbc5ad148ce522390d54d9c774a32e.jpeg)
报错解决。
别扭度:★★★☆☆
---------------------------------------------------------------
所以,还是用g++吧。