2013-03-13 68 views
0

儘管我在Cocoa開發了多年,但我從來沒有必要開發一種用於處理非對象變量的C風格的庫。關於可可C風格功能的一些愚蠢的問題

我稱之爲 「C風格的功能」,例如:

float myCStyleFunction(float var1, float var2); 

知道的Objective-C是C的後代,我試圖做一個真正的C函數。但是一些簡單的東西是編譯器不允許的。

一通按引用:

void makeSomethingWithImages(CGImageRef & im1, CGImageRef & im1); 

這不起作用。 Compilator說Parameter name omitted有沒有辦法通過引用我的CGImages?

其次,默認參數:

void makeSomethingWithImages(CGImageRef im1, CGImageRef im1, float tolerance) { ... } 

void makeSomethingWithImages(CGImageRef im1, CGImageRef im1) { 
    makeSomethingWithImages(im1, im2, 0); 
} 

錯誤:Conflicting types for 'makeSomethingWithImages'

有沒有辦法有一些默認的參數?

而附屬問題:如果Obj-C是C後代,爲什麼這些示例不起作用?

回答

4

通過引用傳遞的是C++ not c,所以默認參數和函數重載,儘管clang爲函數重載增加了c的擴展,但是還有其他語法。

+0

With'void makeSomethingWithImages(CGImageRef im1,CGImageRef im1)',是函數調用時複製的參數嗎? – Martin 2013-03-13 10:19:02

+0

@Martin是的。避免這種情況的唯一方法是發送指針。引用會很好,但Objective-C不支持它。順便提一下,'CGImageRefs'已經是指針了,所以拷貝的數量是最小的。 – Ephemera 2013-03-13 10:24:11

+0

哦,是的,他們是指針,你是對的。你有關於我的第二個問題的解釋(不同的函數簽名有衝突),還是一樣的:僅在C++中可用? – Martin 2013-03-13 10:28:19

0

通行證通過引用應被使用 - *符號(指針地址),&是「值在地址CGImageRefCGImage.h類定義爲CGImage *CGImageRef;所以編譯器ERR ..

0

不,您不能使用引用傳遞機制,也不能在C中使用默認值。如果Obj-C是C的後代,這意味着合法的C代碼可以被Obj-C編譯接受,而不是反向的。

但是你犯了一個錯誤,在Objective-C中沒有引用和默認值。這兩種結構都是C++的,而不是C的。 Objective-C和C++混合使用,它被稱爲Objective-C++。

C++和Objective-C都是C的後代,所以混合使用。