一直被错爱的C/C++语法

12 篇文章 1 订阅
4 篇文章 0 订阅

最近在为dex-理想中的编程语言模型(https://github.com/dexlang/dex)整理一些资料

发现C/C++的函数申明语法真的很奇怪:

golang已经在官方blog详细说明为什么要改掉C的函数声明语法

https://blog.golang.org/gos-declaration-syntax

大意如下:

C的函数声明语法:

retType funcName(paras){}

函数指针申明语法:

int (*fp)(int a, int b);

如果参数带函数指针:

int (*fp)(int (*ff)(int x, int y), int b)

如果去掉参数中的函数名:

int (*fp)(int (*)(int, int), int)

如果返回值是个函数指针:

int (*(*fp)(int (*)(int, int), int))(int, int)

这个奇怪的东西已经没有地球人能够认出来是个函数申明了。

而go的函数声明语法:

func funcName(paras) retType

相应的参数和返回值带函数申明的语法都非常清晰明了:

f func(func(int,int) int, int) int

f func(func(int,int) int, int) func(int, int) int

闭包调用语法也一目了然:

sum := func(a, b int) int { return a+b } (3, 4)

 

另外,在C++的模板申明语法里,也发现了奇怪的地方:

函数模板语法:

template<typaname T> int MyFunc(T a){ ... }

模板类声明语法:

template<typaname T> class MyClass{ ... }

模板类中的关键字class明确可以看出这是一个类申明

而模板函数申明语法,却没法通过关键字得出这是一个模板函数的声明语法。

而相应的,如果用golang的函数声明语法,模板类和模板函数的声明语法大致应该是这个样子:

template<typaname T> func MyFunc(T a) int{ ... }

template<typaname T> class MyClass{ ... }

可以发现,这两种模板的声明语法居然可以出奇的一致:

template<T> templateType(keyword) templateName ...

 

由此,可以得出结论,C/C++函数申明是一种奇怪的语法,经不起各种语法组合的考验,是一种一直被错爱的语法,应该坚决舍弃。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值