一直被錯愛的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++函數申明是一種奇怪的語法,經不起各種語法組合的考驗,是一種一直被錯愛的語法,應該堅決捨棄。

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