C 语言中如何实现泛型?void* 与宏的取舍?