您將無法做到這一點無需提供大量的援助,以調用函數,以便它可以完成自己的工作。看看標準C庫中的兩個'多態'功能,qsort()
和bsearch()
。
void qsort(void *base, size_t nel, size_t width,
int (*compar)(const void *, const void *));
void *bsearch(const void *key, const void *base, size_t nel,
size_t width, int (*compar)(const void *, const void *));
的printf()
和scanf()
家庭是處理多種類型的其他功能。
您的打印陣列功能可能會需要:
typedef int (*DataPrinter)(void *ctxt, void *data);
extern int prarray(void *base, size_t nel, size_t width,
DataPrinter pr_func, void *ctxt)
數據打印功能指針將負責打印一張價值 - 由data
參數指定。 ctxt
值是指向數據打印機功能所需的任何控制信息的指針(它可能與FILE *
一樣簡單,可能更復雜)。從數據打印機功能返回的值是寫入的字符數;從prarray()
返回的值是寫入的字符總數。
這當然只適用於一維數組。爲了打印2D或3D陣列的小部分,您需要更復雜的代碼。如果您需要擔心換行等問題,那很可能是ctxt
的域名。或者你爲這個功能設計更復雜的接口。請注意,爲指定值分隔符提供的唯一機制是通過ctxt
結構。這將起作用(或可以開展工作),但可能太笨拙。
與_Generic
的C2011溶液是有趣的,但需要用於N種類型的N個函數,其中每個把手印刷的陣列。我無法完全擺脫:我的解決方案需要N + 1個函數,但其中只有一個(1)處理數組; N個函數每個處理打印給定類型的單個值,這比打印整個給定類型的數組更簡單。當然,如上所述,它需要在每個相關平臺上使用C 2011編譯器。由於至少有一個「經常相關」的平臺沒有供應商提供的C 1999編譯器,因此可能需要一段時間才能在該平臺上使用C 2011。
C中的多態性!!!!!!!!!!!!!從什麼時候開始? – perilbrain
@perilbrain我知道C沒有內置的多態。有沒有其他一些方法來模仿多態?像'void *' –
C是一種原始語言,它適合編寫內核或作爲輸出語言,但很少。如果你想這樣做,有幾十種其他語言是可能的。 –