C memo

讀這篇,請先理解如何唸它

int a[5];

typedef int array[5]; // array: a "type" of array of int
array a;

是同樣效果。現在要宣告一個 function pointer array (void *func())的話:

 /* func_pointer_t: a "type" of pointer to function returning pointer to void. */
typedef void *(*func_pointer_t)();
func_pointer_t func_array[] = { (func_pointer_t) open, (func_pointer_t) close };  

再混淆一點,多宣告一個 func_array_t 型別

 /* func_pointer_t: a "type" of pointer to function returning pointer to void. */  
typedef void *(*func_pointer_t)();  
/* func_array_t: a "type" of array of pointer to function returning pointer to void */
typedef void *(*func_array_t[])();
func_array_t func_array = { (func_pointer_t) open, (func_pointer_t) close };

或是就很酷的寫

void *(*func_array[])() = { ( (void *(*)()) open, ((void *(*)()) close };

這時候 func_array 就是 an array of pointer to function return pointer to void.
每個元素都是 a pointer to function returning pointer to void.

以上都能達到同樣效果。

當其中加入了 struct 或是 multidimensional array 的時候,情況會更複雜,但是只要知道優先順序(兩種括號優先、再來是星星)、唸法,還是可以輕鬆吃下。

看起來平時用不到,不過透過強制轉型,可以實現型別多型,請參考 rpcgen 產生出的 server code。而這裡講的只是讓作法更簡潔,不用透過一堆的 if 判斷。下次再講。