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

f11b9ad876f103dcce2db9aa253106c3.png

​​我之前写程序,一直是类C的风格,但用g++编译器。因为喜欢面向过程的设计,又觉得c++的某些特性非常的方便。一天心血来潮,把几段程序移植到gcc,遇到几个小问题,以本文记录。
C++的继承,多态,泛型模板之类高级特性,C语言压根没有。这里也不做比较。本文中C语言都用gcc来编译,C++用g++来编译。每个例子都是g++可以通过,但gcc不能通过的情况。并给出如何让gcc通过的方法。1、变量声明的位置
g++可以正常编译的代码

a31d5c1613aedf35f005eeb8cbe80460.png


gcc中,会报变量i的声明不合法。c语言的变量声明必须在函数开始处,所有的代码之前。例如上图中注释的位置。如果函数很长的话,不能再作用域内随时声明变量,还是很不方便,也容易造成更多名字冲突。
别扭度:★★★★☆2、函数名不可以相同
g++正常编译代码

03fd467090ca26587eb7a536e82298e7.png


在g++下,上面两个函数可以同时定义。参数不同,编译器都会编译成不同的函数。这也是支持多态的体现。
gcc下,函数名是不可以重复的。会报错重复定义。代码移植的时候,只能把他们改成不同的可爱的名字。对于起名困难户来说,这也是种痛苦。
别扭度:★★★★★3、不支持布尔类型
g++正常代码

3c77e1cd830787e55e58371567e7f9ee.png


gcc报错bool是没有定义的。我们可以用枚举类型来代替,或者用int类型加宏定义解决。小不方便而已,不是啥大事儿。
别扭度:★☆☆☆☆4、算不算常量?
g++正常代码

4ed455bff9e322833d4b2e9d3b978b42.png


Stdout, stderr本质是指针。C++中他们可以算常量。
gcc中,报错stderr非常量。gcc中非NULL的指针都不能算常量。
修改的方法是把stderr替换成NULL,然后程序逻辑中判断为NULL的情况再赋值给stderr
别扭度:★★☆☆☆5、结构体类型
g++正常代码

93edef582947d0508dc537c17c94bc12.png


g++把struct当成了class处理,所有这个类型定义没问题。
Gcc编译这段代码会出错,提示NODE不是个类型。要用struct NODE node; 定义才能成功,前面必须跟着烦人的struct。
或者在gcc中,用typedef宏定义,可以省略烦人的struct关键词。写成这样gcc就可以通过了。

686289b6f1ef697af4ea7864da5a64c5.png


别扭度:★★☆☆☆6、运算优先级
g++正常代码

ba9c91b5669c590b2a8a95ac34fa93eb.png


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

046ddfa71499d7eb063305a5801a6f77.png


报错解决。
别扭度:★★★☆☆
----------------------------------------------------------------------------------
所以,还是用g++吧。​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值