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

最近在为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++函数申明是一种奇怪的语法,经不起各种语法组合的考验,是一种一直被错爱的语法,应该坚决舍弃。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章