node c语言的作用_C语言与C++在编码细节上的几个不同

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

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

1、变量声明的位置

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

82605495efc40bb3faa5a25347605450.png

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

别扭度:★★★★☆

2、函数名不可以相同

g++正常编译代码

a7a2dcd06a89f2f1a6eeab9b448393b5.png

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

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

别扭度:★★★★★

3、不支持布尔类型

g++正常代码

195f833cb902774f027dd42cdfded87a.png

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

别扭度:★☆☆☆☆

4、算不算常量?

g++正常代码

a196804fdd05a9a27c551b8667047116.png

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

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

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

别扭度:★★☆☆☆

5、结构体类型

g++正常代码

0a03a34d096f2f70fad9a593c3de89d3.png

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

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

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

e879f7b74a4f45f3b8469135eef0aa82.png

别扭度:★★☆☆☆

6、运算优先级

g++正常代码

d896226608d9dfcdaf25e51661762757.png

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

90f489484c6a160709e75de028f9dee6.png

报错解决。

别扭度:★★★☆☆

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值